水仙花數實驗報告

2021-08-29 21:53:53 字數 1670 閱讀 9421

[b]實驗題目[/b]:水仙花數

[b]需要解決問題[/b]:

1.考慮程式的可擴充性,應該做到讓程式修改最少或不用修改能夠求4位或5位的水仙花數。

2.如何分別得到乙個數各個位上的數。

3.對各個位數的求冪。

4.判斷是否是水仙花數。

5.當求的水仙花數較大時,程式求解很慢。

[b]問題解決[/b]:

1.可讓使用者輸入乙個數n(n代表數字的位數)。

2.可先用乙個臨時變數temp儲存需要判斷的數,對temp取模10得到個位上的數,然後使tmep /= 10,重複迴圈得到各個位上的數。

3.求冪運算可使用c++標準庫cmath裡面的pow函式,或者不知道有這個函式的可以自己用for迴圈實現乙個。考慮到pow函式的第乙個引數為浮點數,我們這裡要求的是整數,還需要強制轉換。這裡我就自己寫了乙個。

4.只需簡單地將各個位上的冪相加判斷是否等於原數,是的話就輸出,然後繼續尋找下乙個。

5.看下面演算法優化。

[b]演算法優化[/b]:

1.涉及到冪的運算,為優化時間,避免資料的重複計算,可開乙個陣列儲存1到9的n次冪。

2.判斷乙個數是否是水仙花數需要拆解各個位上的數,如果反向思考,講各個位上的數合起來,時間複雜度就會從o(10 ^ n)降為o(n ^ 10)。

3.對題目進行簡單的分析,可以得出以下結論:

假設:為水仙花數

結論:除外其他的排列都不是水仙花數。

例如:假設123是水仙花數,那麼213,312,321等等都不是水仙花數,稍微一想就能明白。

故本來需要搜尋n!次的變為1次,時間大大減少。

[b]演算法實現[/b]:

1.最主要生成0~9的n-可重組合,將組合表示為陣列

2.將組合求冪取和得到x,將x拆分成各個位數用陣列表示,如果表示x的數列與組合的數列相同,那麼x就是水仙花數

測試資料: 測試結果:

① 3 time: 0ms

② 9 time: 40ms

③ 14 time: 680ms

④ 19 time: -1429ms(時間溢位了。。大概執行時間為6~7s)

c++**如下:

#include 

#include

#include

#include

using namespace std;

long long pow[10]; //儲存從~9的n次冪

int n;

int b[10]; //記錄~9的可重複組合

void check(int n, int *b); //判斷是否是水仙花數並輸出

void dfs(int, int); //生成~9的n-可重組合

int main(void)

dfs(0, n);

time2 = clock();

cout << "time: " << (time2 - time1) * 1000 / clocks_per_sec << "ms" << endl;

return 0;

}void check(int n, int *b)

}if (same) cout << result << endl;

}void dfs(int num, int d) else }}

求水仙花 ghpython 水仙花數02

今天咱們繼續來看看老潘微博裡的乙個python小案例,求水仙花數,這個小案例在前兩天已經分享了,今天分享另一種方法,常言道只要思想不滑坡,方法總比困難多,而且今天的方法個人覺得更pythonic一點。水仙花數 四葉玫瑰數 五角星數 由於2位數的自冪數不存在,這裡直接從100遍歷到100000 for...

水仙花數題解

水仙花數 3位數,其各位數字立方和為該數本身.include stdio.h void main int i,j,k,n 定義n的個位數為k,十位為j,百位為i printf narcissus numbers are for n 100 n 1000 n 使n從100 999迴圈 i n 100 ...

hdu 水仙花數

problem description 春天是鮮花的季節,水仙花就是其中最迷人的代表,數學上有個水仙花數,他是這樣定義的 水仙花數 是指乙個三位數,它的各位數字的立方和等於其本身,比如 153 1 3 5 3 3 3。現在要求輸出所有在m和n範圍內的水仙花數。input 輸入資料有多組,每組佔一行,...