實驗三 求Smith數
實驗目的:
通過本次實驗,掌握窮舉算法的基本思想。
實驗環境:
硬件:PC機
軟件:windows操作系統,C語言
實驗內容:
若一個合數的質因數分解式逐位相加之和等於其本身逐位相加之和,則稱這個數為Smith數。給定一個正整數N,求大於N的最小Smith數。
實驗學時:2
實驗過程:
1.算法設計
設計一個尋找大於N的最小史密斯數,首先這個史密斯數必須大於N,不能為素數。
構造一個int isPrime(int x)函數,來判斷這個數是不是素數。
構造一個int everySum(int x)函數,來計算這個數每個位相加的和。
構造一個int isSmith(int n)函數,調用上面兩個函數來判斷是否符合史密斯數的條件來判斷這個數是不是史密斯數。
主函數調用isSmith(int n)函數得到函數值,並且規定輸入‘0’的時候程序結束。
2.程序清單
1 #include <stdio.h> 2 #include <math.h> 3 //判斷是否為素數 4 int isPrime(int x) 5 { 6 int i,num = 1; 7 for(i = 2; i < x; i++) 8 { 9 if( x % i == 0) 10 { 11 num = -1; 12 break; 13 } 14 } 15 if(num == 1) 16 return 1; 17 else 18 return 0; 19 } 20 //計算每一位相加的和 21 int everySum(int x) 22 { 23 int sum = 0; 24 while(x > 0) { 25 sum += x % 10; 26 x /= 10; 27 } 28 return sum; 29 } 30 //判斷是否為smith數 31 int isSmith(int n) 32 { 33 int i,b = n; 34 int num[1000],x = 0; 35 int sum = 0; 36 while( !isPrime(n)) 37 { 38 for(i = 2; i < n; i++) 39 { 40 if( isPrime(i) && n % i == 0) 41 { 42 num[x] = i; 43 x++; 44 break; 45 } 46 } 47 n /= i; 48 } 49 num[x] = n; 50 for( i = 0; i <= x; i++) 51 { 52 sum += everySum(num[i]); 53 } 54 if(sum == everySum(b)) 55 return 1; 56 else 57 return 0; 58 } 59 //主函數 60 int main() 61 { 62 int num; 63 int flag = 0; 64 while((scanf("%d",&num) != EOF) && (num != 0)) 65 /* 66 EOF,為End Of File的縮寫,通常在文本的最后存在此 67 字符表示資料結束。在本句中表示若輸入'0'表示字符結束。 68 */ 69 { 70 flag = 0; 71 for(int i = num + 1; ; i++) 72 { 73 if( isSmith(i) ) 74 { 75 printf("%d\n",i); 76 flag ++; 77 } 78 if(flag == 1) 79 { 80 break; 81 } 82 } 83 } 84 return 0; 85 }
3.運行結果
實驗總結:
通過這次實驗,學會了怎樣判斷一個數是否為Smith數和它的判斷條件,以及它的算法程序設計,用遞歸的方法寫出了程序,以后要多利用遞歸算法,將大問題划分為小問題,優化程序設計。