实验三 求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 ",i); 76 flag ++; 77 } 78 if(flag == 1) 79 { 80 break; 81 } 82 } 83 } 84 return 0; 85 }
3.运行结果
实验总结:
通过这次实验,学会了怎样判断一个数是否为Smith数和它的判断条件,以及它的算法程序设计,用递归的方法写出了程序,以后要多利用递归算法,将大问题划分为小问题,优化程序设计。