輸出0~999999之間的水仙花數
阿新 • • 發佈:2018-11-10
水仙花數,就是一個n位數的每位數的n次方之和與這個數本身相等,謂之水仙花數。(在一些資料上提到的只有三位數是水仙花數,其他位數有其他的名字,此處不深究,就按照例子上的定義求解水仙花數)
例如153=1^3 + 5^3 + 3^3,再例如1634=1^4 + 6^4 + 3^4 + 4^4。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int i = 0; for (i = 0; i < 1000000; i++) { int count = 1; int tmp = i; int sum = 0; //計算幾位數 while (tmp / 10) { count++; tmp /= 10; } //計算每位數的次方和 tmp = i; while (tmp) { sum += (int)pow(tmp % 10, count); tmp = tmp / 10; } //比較 if (i == sum) printf("%d ", i); } system("pause"); return 0; }
可以把程式分為三部分去寫:
首先計算當前數為幾位數 ,這裡用tmp/10來實現,每除10就將個位除掉,直至為0,將位數統計下來;這裡重點說明一下count一 開始為什麼從1開始,因為判斷條件是tmp/10,當tmp為1位數時,tmp/10 = 0;此時不執行count++,所以我們可以這樣 認為: 不管是什麼數,最少都會有一位。(此處若是還不能理解,請看最後重新給一個程式碼)
其次計算當前次數的各位數的次方和,具體不分析了,看程式碼;
最後再比較次數與它的各位數次方和是否相等,相等則是水仙花數,輸出即可。
最後再給一個程式碼,執行結果一樣,稍加改動
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int i = 0; for (i = 0; i < 1000000; i++) { int count = 0; int tmp = i; int sum = 0; //計算幾位數 while (tmp ) { count++; tmp /= 10; } //計算每位數的次方和 tmp = i; while (tmp) { sum += (int)pow(tmp % 10, count); tmp = tmp / 10; } //比較 if (i == sum) printf("%d ", i); } system("pause"); return 0; }
有這麼一句程式碼 sum += (int)pow(tmp % 10, count)
這裡用到了強制型別轉化,這裡將等號右邊的原本為double型別強制轉化為int型別,若沒有進行強制型別轉化,程式執行會報一個警告,此處憑個人意願。