水仙花数

初探水仙花数

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()即可。

  代码最终实现输入两个数mn,输出mn之间的所有水仙花数,若两数之间无水仙花数,则输出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ㄒ)/~~,希望不吝赐教。

猜你喜欢

转载自www.cnblogs.com/waytc/p/8835836.html