水仙花數
- 算法思路
1、當輸入 n 位數時對所求數值劃定範圍並從小到大判斷數值是否符合要求, 例如當 n = 3 時,範圍爲 100 -999 之間;
2、分別取不同位的數值,進行 n 次冪運算;
3、比較運算結果是否合理,進行輸出。 - 錯誤代碼:
// 水仙花數
#include<stdio.h>
int main()
{
int a;
int b=1;
int c=1;
int d;
int e;
int sum=0;
int f=1;
int g;
int h;
printf("please input number(3-8):");
scanf("%d",&a);
while(b<a){
c*=10;
b++;
}
d=c;
while(c<c*10){
while(d>0){
e=d%10;
g=a;
d/=10;
while(g>=1){
f*=e;
g--;
}
sum+=f;
if(sum==c){
printf("水仙花數爲%d\n",c);
}
f=1;
}
sum=0;
c++;
d=c;
}
return 0;
}
代碼輸出:
please input number(3-8):3
水仙花數爲125
水仙花數爲153
水仙花數爲216
水仙花數爲370
水仙花數爲371
水仙花數爲407
水仙花數爲729
--------------------------------
Process exited after 22.57 seconds with return value 0
請按任意鍵繼續. .
代碼分析:sum+=f; if(sum==c){ printf("水仙花數爲%d\n",c);
這裏的 if 條件語句設置會出現三位數值中當其中兩位的n次冪運算等於所求數值時,直接輸出錯誤結果。
- 正確代碼
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
int b=1;
int c=1;
while(b<a){
c*=10;
b++;
}
while(c<c*10){
int d;
int e=c;
int sum=0;
while(e>0){
d=e%10;
e/=10;
int f=0;
int g=1;
while(f<a){
g*=d;
f++;
}
sum+=g;
}
if(sum == c){
printf("%d\n",sum);
}
c++;
}
}
代碼輸出:
3
153
370
371
407
--------------------------------
Process exited after 22.07 seconds with return value 0
請按任意鍵繼續. . .
代碼分析:
當輸入整數位數 n 時首先進行轉換成該整數位數下的最下值,然後對最小值進行取餘後運算得到每位的 n 次冪,然後累加結果並比較當前數值是否相同。
- 總結
錯誤程序的原因在於if(sum==c){ printf("水仙花數爲%d\n",c);}
語句寫在了取餘運算循環的內部,這就導致了即使在取餘運算未結束時,當小於 n 位餘數滿足 n 次冪的結果相加和等於運算數值,即使不是滿足結果也會強行輸出運算數值。
當程序存在多重循環時,一定要理清楚循環單個循環實現的意義,還有就是循環類似於函數,在循環內部定義的變量,在循環外部便不會存在。