您的位置:首页 > 其它

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

#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;
}


效率很低,需要一个小时左右。仅供参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: