21位水仙花数
2013-05-03 17:59
274 查看
一个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
效率很低,需要一个小时左右。仅供参考。
例如:
当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
#include<stdio.h> #include<string.h> char a[10][22][22]; char key[21474836][10]; //两个数字字符串相加 char* strAddstr(char *s1,int len1,char *s2,int len2) { char c[200]; char *s=c; int i=len1-1,j=len2-1,k=0; int flag=0; int sum; for(;i>=0&&j>=0;i--,j--,k++) { sum=(s1[i]-'0')+(s2[j]-'0')+flag; (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0'); } for(;i>=0;i--,k++) { sum=(s1[i]-'0')+flag; (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0'); } for(;j>=0;j--,k++) { sum=(s2[j]-'0')+flag; (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0'); } if(flag) c[k++]='1'; c[k]=0; strrev(s); return s; } void init() { int i,j,len; strcpy(a[1][1],"1"); strcpy(a[2][1],"2097152"); strcpy(a[3][1],"10460353203"); strcpy(a[4][1],"4398046511104"); strcpy(a[5][1],"476837158203125"); strcpy(a[6][1],"21936950640377856"); strcpy(a[7][1],"558545864083284007"); strcpy(a[8][1],"9223372036854775808"); strcpy(a[9][1],"109418989131512359209"); for(i=1;i<=9;i++) for(j=2,len=strlen(a[i][1]);j<=21;j++) { if(i==9&&j==10) break; strcpy(a[i][j],strAddstr(a[i][j-1],strlen(a[i][j-1]),a[i][1],len)); } } int sum(char *s,char *temp) { int i,count[10]={0}; strcpy(temp,"0"); for(i=0;i<21;i++) { switch(s[i]) { case '1':count[1]++;break; case '2':count[2]++;break; case '3':count[3]++;break; case '4':count[4]++;break; case '5':count[5]++;break; case '6':count[6]++;break; case '7':count[7]++;break; case '8':count[8]++;break; case '9':count[9]++;break; } }//end for if(count[9]>9) return 0; for(i=1;i<=9;i++) { if(count[i]) { int len1=strlen(temp); int len2=strlen(a[i][count[i]]); strcpy(temp,strAddstr(temp,len1,a[i][count[i]],len2)); } } return 1; } int main() { init(); char temp[22]; int count=0; char i[22] = "449157399146038697005"; while(count!=2) { for(int j=20;j>=0;j--) { if(i[j]!='9') { i[j]+=1; break; } else i[j]='0'; } if(sum(i,temp)&&strlen(temp)==21&&strcmp(temp,i)==0)//不相等 { puts(i); count++; } } getchar(); return 0; }
效率很低,需要一个小时左右。仅供参考。