初探水仙花数
1、什么是水仙花数
水仙花数是指一个3位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
2、解决水仙花数的思路
根据定义,应将要求的数其各位的立方和求出,将原数与所求和相比较,若值相同,则为水仙花数。可以用变量sum存储所求数各位的立方和。
如何存储各位?显然,用原数对10不断取余可以将原数各位从低到高依次剥离出来。
1 while(ISshui/10!=0){ 2 s[j++]=ISshui%10; 3 ISshui=ISshui/10; 4 } 5 if(ISshui/10==0){ 6 s[j++]=ISshui%10;; 7 }
通过上述操作,此时已经将所求数各位从低到高存入s[n]数组中,依次对各位进行立方运算并求和,再将其和与原数进行比较即可。
3、完整代码(DEV-C++运行通过)
最终实现时进行了部分优化,不再将所求数各位存入数组,而是直接进行立方运算,然后存入sum,这样就免去循环求和,节省运行时间。包含在头文件math中的函数pow(number,times)完成立方运算,其中number表示要进行立方运算的数,times表示几次幂,此处应为3。使用while(scanf("%d %d",&m,&n))进行多组样例输入,若不需要多组样例输入,将其改为正常scanf()即可。
代码最终实现输入两个数m和n,输出m,n之间的所有水仙花数,若两数之间无水仙花数,则输出no。
1 #include "stdio.h" 2 #include "math.h" 3 4 //判断是否是水仙花数 5 int SXH(int ISshui) 6 { 7 int sum=0; //存储各位的立方和 8 int m=ISshui; 9 10 while(ISshui/10!=0){ 11 sum=sum+pow((ISshui%10),3); 12 ISshui=ISshui/10; 13 } 14 if(ISshui/10==0){ 15 sum=sum+pow((ISshui%10),3); 16 } 17 18 if(sum!=m){ 19 sum=0; 20 } 21 22 return sum; 23 } 24 25 int main(){ 26 27 int m,n,count=0; 28 int i,j=0; 29 while(scanf("%d %d",&m,&n)){ 30 if(m==0&&n==0){ 31 break; 32 } 33 for(i=m;i<=n;i++){ 34 if(SXH(i)!=0){ 35 printf("%d ",i); 36 count++; 37 } 38 } 39 40 if(count==0){ 41 printf("no"); 42 } 43 printf("\n"); 44 j=0; 45 count=0; 46 } 47 48 return 0; 49 }
4、代码缺陷
上述代码虽经过简单优化,但时间复杂度仍过大。最终目标是将其运行时间控制在1s以内,目前尚未解决(ㄒoㄒ)/~~,希望不吝赐教。