33,010
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#define N 4
struct dic{
int list[N];
} ;
struct dic lister[10]; //存放的是1到9的完全立方数
struct dic listerer[10]; //二位数组
int hash[10];
int flowernumbers[N]; //存放水仙花数
void flowerNumber(int n, int number);
int boolerer(int number);
void Flower();
void add(int a[],int number1) //这是一个模拟乘法
{
int i, buff;
for(i = buff = 0; i < N; i++){
a[i] = a[i] * number1 + buff;
buff = a[i] > 9 ? a[i] / 10 : 0;
a[i] %= 10;
}
}
//存1-9的N次方
void numberPower()
{
int n,i;
for(i = 1; i < 10; i++){
n = N;
lister[i].list[0] = i;
while(--n)
add(lister[i].list,i);
}
}
int main()
{
int i;
numberPower();
Flower();
scanf("%d",&i);
}
void Flower()
{
flowerNumber(N,0);
}
void flowerNumber(int n, int number) //
{
int i;
for(i = n; i >=0; i--) //i为number出现的次数
{
hash[number] = i;
listerer[number] = lister[number]; //取出立方数
add(listerer[number].list,i); //乘以个数
if( n-i > 0 && number < 9) //数字不足,且数字小于9
flowerNumber(n - i,number+1);
else
{
if(boolerer(number) == 0)
continue;
else
{
for(int k = N-1;k >= 0; k--) //输出结果
k == 0 ? printf("%d\n",flowernumbers[k]) : printf("%d",flowernumbers[k]);
}
}
}
}
int boolerer(int number)
{
int i,j;
int buf = 0;
int my[10] = {0};
for(i = 0;i < 10; i++)
my[i] = hash[i];
for(i = 0;i < N; i++) { //每次计算水仙花数都要清零
flowernumbers[i]=0;
}
for(i = 0; i < N; i++){ //N个数
for(j = 0;j < 10; j++) {
flowernumbers[i] += listerer[j].list[i]; //第i个数为10个数之和
}
flowernumbers[i] += buf;
//if(--my[(flowernumbers[i] % 10)] < 0) return 0;
buf = flowernumbers[i] / 10;
flowernumbers[i] %= 10;
//如果用上面那句注释掉的代替下面两句,结果居然不一样.......
my[flowernumbers[i]]--; //使用的数字减1
if(my[flowernumbers[i]] < 0) return 0; //发现使用的数字为负,则不成立
}
return 1;
}