一个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 }
效率很低,需要一个小时左右。仅供参考。