水仙花数
初探水仙花数
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++运行通过)
1.1 输入整数N,判断N是否是水仙花数
#include "stdio.h" int main(){ int N; int a[2]; int IS=0; scanf("%d",&N); int M=N; for(int i=0;i<3;i++){ a[i]=N%10; N=N/10; IS=IS+a[i]*a[i]*a[i]; } if(M==IS){ printf("yes"); }else{ printf("no"); } return 0; }
若是,则输出yes,否则输出no。
1.2 输入整数N,输出N以内的所有水仙花数
#include "stdio.h" #include "math.h" //判断是否是水仙花数 int SXH(int ISshui) { int sum=0; //存储各位的立方和 int m=ISshui; while(ISshui/10!=0){ sum=sum+pow((ISshui%10),3); ISshui=ISshui/10; } if(ISshui/10==0){ sum=sum+pow((ISshui%10),3); } if(sum!=m){ sum=0; } return sum; } int main(){ int N; scanf("%d",&N); bool ha=false; int i; for(i=100;i<=N;i++){ if(SXH(i)!=0){ printf("%d\n",i); ha=true; } }
//N以内无水仙花数 if((i==N+1)&&ha==false){ printf("%d以内无水仙花数",N); } return 0; }
4、小变形
实现输入两个数m和n,输出m,n之间的所有水仙花数,若两数之间无水仙花数,则输出no。
实现时进行了部分优化,不再将所求数各位存入数组,而是直接进行立方运算,然后存入sum,这样就免去循环求和,节省运行时间。包含在头文件math中的函数pow(number,times)完成立方运算,其中number表示要进行立方运算的数,times表示几次幂,此处应为3。使用while(scanf("%d %d",&m,&n))进行多组样例输入,若不需要多组样例输入,将其改为正常scanf()即可
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 }
上述代码虽经过简单优化,但时间复杂度仍过大。最终目标是将其运行时间控制在1s以内,目前尚未解决,希望不吝赐教。

浙公网安备 33010602011771号