21位水仙花数

一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。

程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。

如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。

输出样例:
128468643043731391252
449177399146038697307

  1 #include<stdio.h>
  2 #include<string.h>
  3 
  4 char a[10][22][22];
  5 char key[21474836][10];
  6 
  7 //两个数字字符串相加 
  8 char* strAddstr(char *s1,int len1,char *s2,int len2)
  9 {
 10     char c[200];
 11     char *s=c;
 12     int i=len1-1,j=len2-1,k=0;
 13     int flag=0;
 14     int sum;
 15     for(;i>=0&&j>=0;i--,j--,k++)
 16     {
 17         sum=(s1[i]-'0')+(s2[j]-'0')+flag;
 18         (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0');
 19     }
 20     for(;i>=0;i--,k++)
 21     {
 22         sum=(s1[i]-'0')+flag;
 23         (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0');
 24     }
 25     for(;j>=0;j--,k++)
 26     {
 27         sum=(s2[j]-'0')+flag;
 28         (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0');
 29     }
 30     if(flag) c[k++]='1';
 31     c[k]=0;
 32     strrev(s);
 33     return s;
 34 }
 35 
 36 void init()
 37 {
 38     int i,j,len;
 39     strcpy(a[1][1],"1");
 40     strcpy(a[2][1],"2097152");
 41     strcpy(a[3][1],"10460353203");
 42     strcpy(a[4][1],"4398046511104");
 43     strcpy(a[5][1],"476837158203125");
 44     strcpy(a[6][1],"21936950640377856");
 45     strcpy(a[7][1],"558545864083284007");
 46     strcpy(a[8][1],"9223372036854775808");
 47     strcpy(a[9][1],"109418989131512359209");
 48     for(i=1;i<=9;i++)
 49         for(j=2,len=strlen(a[i][1]);j<=21;j++)
 50         {
 51             if(i==9&&j==10) break;
 52             strcpy(a[i][j],strAddstr(a[i][j-1],strlen(a[i][j-1]),a[i][1],len));
 53         }
 54 }
 55 
 56 int sum(char *s,char *temp)
 57 {
 58     int i,count[10]={0};
 59     strcpy(temp,"0");
 60     for(i=0;i<21;i++)
 61     {
 62         switch(s[i])
 63         {
 64             case '1':count[1]++;break;
 65             case '2':count[2]++;break;
 66             case '3':count[3]++;break;
 67             case '4':count[4]++;break;
 68             case '5':count[5]++;break;
 69             case '6':count[6]++;break;
 70             case '7':count[7]++;break;
 71             case '8':count[8]++;break;
 72             case '9':count[9]++;break;
 73         }
 74     }//end for
 75     if(count[9]>9)
 76     return 0;
 77     
 78     for(i=1;i<=9;i++)
 79     {
 80         if(count[i])
 81         {    
 82             int len1=strlen(temp);
 83             int len2=strlen(a[i][count[i]]);
 84             strcpy(temp,strAddstr(temp,len1,a[i][count[i]],len2));
 85         }
 86     }
 87     return 1;
 88 }
 89 int main()
 90 {
 91     init();
 92     char temp[22];
 93     int count=0;
 94     char i[22] = "449157399146038697005";
 95     while(count!=2)
 96     {    
 97         for(int j=20;j>=0;j--)
 98         {
 99             if(i[j]!='9')
100             {
101                 i[j]+=1;
102                 break;
103             }
104             else
105                 i[j]='0';
106         }
107         if(sum(i,temp)&&strlen(temp)==21&&strcmp(temp,i)==0)//不相等
108         {
109             puts(i);
110             count++;
111         }
112     }
113     getchar();
114     return 0;
115 }

效率很低,需要一个小时左右。仅供参考。

原文地址:https://www.cnblogs.com/dzqdzq/p/3057129.html