水仙花数

 

初探水仙花数

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、小变形

  实现输入两个数mn,输出mn之间的所有水仙花数,若两数之间无水仙花数,则输出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以内,目前尚未解决,希望不吝赐教。

posted @ 2018-04-14 21:43  KID1412A  阅读(963)  评论(0)    收藏  举报