C語言:PAT練習:水仙花數( T & F)

水仙花數

  1. 算法思路
    1、當輸入 n 位數時對所求數值劃定範圍並從小到大判斷數值是否符合要求, 例如當 n = 3 時,範圍爲 100 -999 之間;
    2、分別取不同位的數值,進行 n 次冪運算;
    3、比較運算結果是否合理,進行輸出。
  2. 錯誤代碼:
// 水仙花數
#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次冪運算等於所求數值時,直接輸出錯誤結果。

  1. 正確代碼
#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 次冪,然後累加結果並比較當前數值是否相同。

  1. 總結
    錯誤程序的原因在於if(sum==c){ printf("水仙花數爲%d\n",c);}語句寫在了取餘運算循環的內部,這就導致了即使在取餘運算未結束時,當小於 n 位餘數滿足 n 次冪的結果相加和等於運算數值,即使不是滿足結果也會強行輸出運算數值。
    當程序存在多重循環時,一定要理清楚循環單個循環實現的意義,還有就是循環類似於函數,在循環內部定義的變量,在循環外部便不會存在。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章