[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 輸入資料有多組,每組佔一行,...