永发信息网

花朵数:一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。 例

答案:2  悬赏:40  手机版
解决时间 2021-02-25 00:50
  • 提问者网友:咪咪
  • 2021-02-24 09:00
花朵数:一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。 例
最佳答案
  • 五星知识达人网友:鱼芗
  • 2021-02-24 09:15
简单说一下做法,把0~9的21次方都计算出来,存在数组里,然后开始枚举这个21位数中0~9各有多少个,并把和求出来,然后看和中0~9的个数是否与枚举的个数相等,相等则符合要求并存下来,最后把所有符合要求的数排个序即可,时间复杂度C(30,9)*(10+1)*21=3*e9,3分钟之内能出结果。

=====================2015年5月20日补充=====================
#include

#define N 21
#define base 10000000

int powerN[10][3];
int ans=0;
int Armstrong_number[90][3];
int cnt[10];

void calc_powerN()
{
int i, j, k;
for (i=0; i<10; i++)
{
powerN[i][2]=powerN[i][1]=0;
powerN[i][0]=1;
for (j=0; j for (k=2; k>=0; k--)
{
powerN[i][k]*=i;
if (powerN[i][k]>base)
{
powerN[i][k+1]+=powerN[i][k]/base;
powerN[i][k]%=base;
}
}
}
}

int check()
{
int i, j, sum[3]={0, 0, 0}, c[10];
for (i=0; i<10; ++i) c[i]=cnt[i];
for (i=0; i<10; i++)
for (j=0; j<3; j++)
sum[j]+=powerN[i][j]*cnt[i];
for (j=0; j<2; j++)
{
sum[j+1]+=sum[j]/base;
sum[j]%=base;
}
if (sum[2]<1000000) return 1;
for (j=0; j<3; j++)
Armstrong_number[ans][j]=sum[j];
for (i=0; i<7; i++)
for (j=0; j<3; j++)
{
if (!c[sum[j]%10]) return 0;
c[sum[j]%10]--;
sum[j]/=10;
}
ans++;
return 0;
}

int dfs(int deep, int rest)
{
if (deep==0)
{
cnt[deep]=rest;
if (check()) return 1;
return;
}
int i;
for (i=rest; i>=0; i--)
{
cnt[deep]=i;
if (dfs(deep-1, rest-i)) return 1;
}
return 0;
}

int Compare(int i, int j)
{
int k;
for (k=2; k>=0; k--)
{
if (Armstrong_number[i][k] if (Armstrong_number[i][k]>Armstrong_number[j][k]) return 1;
}
return 0;
}

void Swap(int i, int j)
{
int k;
for (k=0; k<3; k++)
{
int tmp;
tmp=Armstrong_number[i][k];
Armstrong_number[i][k]=Armstrong_number[j][k];
Armstrong_number[j][k]=tmp;
}
}

void Sort()
{
int i, j;
for (i=0; i for (j=i+1; j if (Compare(i, j)>0) Swap(i, j);
}

void print()
{
int i;
for (i=0; i printf("%d%07d%07d\n", Armstrong_number[i][2], Armstrong_number[i][1], Armstrong_number[i][0]);
}

int main()
{
calc_powerN();
dfs(9, N);
Sort();
print();
return 0;
}
全部回答
  • 1楼网友:鸠书
  • 2021-02-24 09:23
#include
#include
#include
#include
#include
void mc(int*b,int *a);
void f(int *s,int n);
void g(int *f,int *a);
int main()
{
int k=0;
int f1[10][21];
memset(f1,0,sizeof(f1));
int f2[10][21];
memset(f2,0,sizeof(f2));
int a[10],b[10];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int h[21];
memset(h,0,sizeof(h));
int y[21]={-1};
bool th =true;
for(int i=0;i<10;i++)
{
f1[i][0]=i;
f(f1[i],21);
}
clock_t begin_time, end_time;
begin_time= clock();
for( a[0]=0;a[0]<21;a[0]++)
for( a[1]=0;a[1]<21-a[0];a[1]++)
for( a[2]=0;a[2]<21-a[0]-a[1];a[2]++)
for( a[3]=0;a[3]<21-a[2]-a[0]-a[1];a[3]++)
for( a[4]=0;a[4]<21-a[3]-a[2]-a[1]-a[0];a[4]++)
for( a[5]=0;a[5]<21-a[4]-a[3]-a[2]-a[1]-a[0];a[5]++)
for( a[6]=0;a[6]<21-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[6]++)
for( a[7]=0;a[7]<21-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[7]++)
for( a[8]=0;a[8]<21-a[7]-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[8]++)
{
a[9]=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]-a[8];
if(a[9]<=0||a[9]>9)continue;
int gh;

for(int i=0;i<10;i++)
{
gh=0;
for(int j=0;j<21;j++)
{
int t=f1[i][j]*a[i]+gh;
f2[i][j]=t%10;
gh=t/10;
}
}
for(i=0;i<10;i++)
{
g(f2[i],h);
}
mc(b,h);
for(i=0;i<10;i++)
{
if(b[i]!=a[i])
{
th =false;
break;
}
}
if(th ==true)
{

for(i=20;i>=0;i--)
cout< cout< }
th =true;
memset(b,0,sizeof(b));
memset(h,0,sizeof(h));
memset(f2,0,sizeof(f2));
}
end_time = clock();
printf("\nTime elapsed:%.3lf (ms)\n",(double)(end_time-begin_time));
return 0;
}
void mc(int*b,int *a)
{
for(int i=0;i<21;i++)
{
int n=a[i];
switch(n)
{
case 0:b[0]++;break;
case 1:b[1]++;break;
case 2:b[2]++;break;
case 3:b[3]++;break;
case 4:b[4]++;break;
case 5:b[5]++;break;
case 6:b[6]++;break;
case 7:b[7]++;break;
case 8:b[8]++;break;
case 9:b[9]++;break;
}
}
}
void f(int *s,int n)
{ int c=fabs(s[0]),h=0;
for(int i=0;i<20;i++)
{ h=0;

for(int j=0;j<21;j++)
{
int t=fabs(s[j])*c+h;
s[j]=t%10;
h=t/10;
}
}
}
void g(int *f,int *a)
{
int c=0;
for(int i=0;i<21;i++)
{
int t=f[i]+a[i]+c;
a[i]=t%10;
c=t/10;
}
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯