[bo][un]hoodlum1980[/un] 在 2008-10-23 12:11 的发言:[/bo]
这道题本质上其实是大数加法。把每一位的立方累加就行了。最后判断一下两个数组是否相等,没有复杂性。
这道题本质上其实是大数加法。把每一位的立方累加就行了。最后判断一下两个数组是否相等,没有复杂性。
谁告诉你只有立方???????????
拜托了,说题目简单的,都是些不懂题目的,还有想当然的
程序代码:#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char number[200];
int sum[200];
int pow[10][200]; /*存储1~9的n次幂*/
/* a= a*k, a是大数,k是0~9的数字!*/
void multiply(int a[], int k)
{
int i,j;
for(i=1;i<=a[0];i++)
a[i] *= k;
for(i=1;i<=a[0];i++)
{
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
if(a[ a[0]+1 ]!=0) a[0]++;
}
/*计算出0~9的n次方,缓存入数组B*/
void InitPow(int n)
{
int i,j;
memset(pow,0,sizeof(pow));
pow[1][0]=pow[1][1]=1;
for(i=2;i<10;i++)
{
pow[i][0]=1;
pow[i][1]=i;
for(j=1;j<n;j++)
multiply(pow[i],i);
}
}
void formular(int a[])
{
int i;
if(a[a[0]]>9) a[0]++;
for(i=1;i<=a[0];i++)
{
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
}
}
void Add(int a[], int b[])
{
int i;
a[0]=max(a[0],b[0]);
for(i=1;i<=b[0];i++)
{
a[i]+=b[i];
}
formular(a);
}
/*需要先初始化数组B*/
int IsShuiXian(const char* num)
{
int i;
char *s=num;
memset(sum, 0, sizeof(sum));
while(*s)
{
Add(sum, pow[*s-'0']);
s++;
}
/*判断是否是水仙花*/
if(strlen(num)!=sum[0]) return 0;
for(i=1;i<=sum[0];i++)
if(sum[i]!=num[sum[0]-i]-'0')
return 0;
/*是水仙花*/
return 1;
}
/*输出N位的水仙花数 n>=2*/
void OutPutN(int n)
{
int i,j,k;
char temp[100];
InitPow(n);
memset(number,'0',n);
memset(temp,'9',n);
number[0]='1';
temp[n]=number[n]=0;
do
{
number[n-1]++;
i=n-1;
while(i>0 && number[i]>'9')
{
number[i]='0';
i--;
number[i]++;
}
if(IsShuiXian(number))
printf(" %s \n", number);
}
while(strcmp(number,temp));
}
void main()
{
int n;
printf("input a number to judge: \n");
gets(number);
InitPow(strlen(number));
if(IsShuiXian(number))
printf(" is.\n");
else
printf(" is not.\n");
/*输出n位水仙花数*/
printf("input n=? (n>2 && n<100)\n");
scanf("%d",&n);
OutPutN(n);
}