21 位花朵数,我求解的方法有问题,请求指点迷津
我先说一下我的算法思想,恳求大家帮帮看看出错出,我觉得是在major函数处,但又不知怎么错了。想法是这样的:首先得到1~9的21次方,然后枚举每一位出现的可能,即(1~9),总共有21位,但照我这样最后是不出现应打印出的花朵数。麻烦大家了。花朵数:(1的三次方+3的3次方+5的三次方=135),135就是三位数的花朵数#include<stdio.h>
#include<stdlib.h>
//得到1~9的21次方
void multi(int a[21],int n){
int i,j;
int temp,nextemp;
for(i=1;i<=21;i++)
{
temp=0;
for(j=0;j<=20;j++)
{
nextemp=(a[j]*n+temp)/10;
a[j]=(a[j]*n+temp)%10;
temp=nextemp;
}
}
}
//任意2个1~9的21次方相加
void add(int a[21],int b[21],int c[21]){
int temp,nextemp;
int i;
temp=0;
for(i=0;i<=20;i++)
{
nextemp=(a[i]+b[i]+temp)/10;
c[i]=(a[i]+b[i]+temp)%10;
temp=nextemp;
}
}
//判断temp是不是花朵数
int fanhui(int temp[21],int a[9][21]){
int ans[21]={0};
int question[10]={0};
int i,j;
for(i=0;i<=20;i++)
for(j=1;j<=9;j++)
if(temp[i]==j)
{
question[j]++;
break;
}
for(i=1;i<=9;i++)
for(j=question[i];j>0;j--)
add(ans,a[i-1],ans);
for(i=0;i<=20;i++)
{
if(ans[i]!=temp[i])
break;
}
if(i==21)
{
for(j=0;j<=20;j++)
printf("%d",temp[j]);
printf("\n");
}
}
//递归产生temp
void major(int n,int temp[21],int a[9][21]){
int come[21];
int i;
for(i=0;i<=20;i++)
come[i]=temp[i];
if(n==21) {
fanhui(temp,a);
return;
}
for(i=0;i<=8;i++)
{
add(temp,a[i],temp);
major(n+1,temp,a);
for(i=0;i<=20;i++)
temp[i]=come[i];
}
}
int main(){
int temp[21]={0};
int a[9][21]={0};
int i,j;
for(i=0;i<=8;i++)
a[i][0]=1;
for(i=0;i<=8;i++)
multi(a[i],i+1);
for(i=0;i<=8;i++)
{
for(j=20;j>=0;j--)
printf("%d",a[i][j]);
printf("\n");
}
major(1,temp,a);
return 0;
}