[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); }