21花朵数
1 #include<stdio.h> 2 #include<time.h> 3 #include<string.h> 4 //#include<conio.h> 5 //#include<math.h> 6 //有的注释 是用来测试数据 7 #define N 21 8 int a[10][N+1]; 9 void fun() 10 { 11 int i,temp,j,k,t; 12 memset(a,0,sizeof(a)); 13 for(i=1;i<10;i++) 14 { 15 a[i][0]=1; 16 for(j=0;j<N;j++) 17 { 18 temp=0; 19 for(k=0;k<N+1;k++) 20 { 21 t=a[i][k]*i+temp; 22 temp=t/10; 23 a[i][k]=t%10; 24 } 25 } 26 } 27 for(i=0;i<10;i++) 28 { 29 for(j=N-1;j>=0;j--) 30 if(a[i][j]!=0)break; 31 32 a[i][N]=j+1; //记录从第几个开始之后全部为0 33 } 34 //可以在此处输出结果以供检查错误 35 for(i=0;i<10;i++) 36 { 37 printf("i=%d\n",i); 38 for(j=0;j<N+1;j++) 39 printf("%3d",a[i][j]); 40 printf("\n"); 41 } 42 } 43 void fun1() 44 { 45 int b[N]; 46 int c[N]={0},d[N]={0},e[10]={0};//c[N]存b[N]中每个数字的21次方之和 47 int x,i,j,k,temp,flag; //d[N]存c[N]从大到小排好序的值 48 int f[100][21]; //用来存放满足条件的数 然后从小到大输出 49 for(i=0;i<9;i++) //b[N]存从99……99到100……00之间的数 初始化为9个9后面全是8,因为10个9的21次方之和将超过21位数 50 b[i]=9; 51 for(i=9;i<N;i++) 52 b[i]=8; 53 k=0;//先将满足条件的数组个数清为0 54 while(b[0]!=0) //e[N]存中间排序的中间量 选择的排序方法比较特别(已知最大值的排序) 55 { 56 flag=1; 57 58 //求21个数的21次方之和 59 for(i=0;i<N;i++) 60 { 61 temp=0; 62 for(j=0;j<N;j++) 63 { 64 temp=temp/10+a[b[i]][j]+c[j]; 65 c[j]=temp%10; 66 if(j==N-1&&temp>9) // 67 { 68 flag=0; 69 //printf("超过21位数\n"); 70 break; 71 } 72 if(a[b[i]][j]==0&&j>=a[b[i]][N])break;// 73 } 74 if(flag==0)break;// 这些都是为了节省时间 进行程序优化 75 76 } 77 //getch(); 78 if(c[N-1]==0)flag=0; 79 if(flag) 80 { 81 //将c[N]排序 注意排序方法 复杂度较低 82 x=0; 83 for(i=0;i<N;i++) 84 e[c[i]]++; //分别有几个0到9 存到e[N]中 曾将c[i]错写成b[i]~~ 85 for(i=10-1;i>=0;i--) 86 { 87 for(j=0;j<e[i];j++) 88 d[x++]=i; 89 } 90 91 //比较二者是否相等 92 for(i=0;i<N;i++) 93 { 94 if(b[i]!=d[i]) 95 { 96 flag=0; 97 break; 98 } 99 } 100 }//if 101 //如果标记falg=1则输出结果 102 if(flag) 103 { 104 /*printf("输出结果为:"); 105 for(i=N-1;i>=0;i--) 106 printf("%d",c[i]); 将c[i]曾错写成b[i] 107 printf("\n");若这样输出则为从大到小输出*/ 108 j=0; 109 for(i=N-1;i>=0;i--) 110 f[k][j++]=c[i]; 111 k++; 112 } 113 //找下一个a[N] 114 for(i=N-1;i>=0;i--) 115 if(b[i]!=0) //此处曾经出错 将b[i]写成a[i] 116 break; 117 temp=b[i]; 118 // printf("temp=%d ",temp); 119 while(i<N) 120 { 121 b[i++]=temp-1; //保证去掉重复的数 并按从大到小顺序 进行处理 122 } 123 //printf("b[2]=%d b[3]=%d\n",b[2],b[3]); 124 125 memset(c,0,sizeof(c));//全部置0 因为后面还要用 126 memset(d,0,sizeof(d)); 127 memset(e,0,sizeof(e)); 128 } 129 //从小到大输出 130 for(i=k-1;i>=0;i--) 131 { 132 for(j=0;j<N;j++) 133 printf("%d",f[i][j]); 134 printf("\n"); 135 } 136 } 137 int main() 138 { 139 fun(); 140 // fun1(); 141 142 printf("\n程序运行了%.2lf秒\n",(double)clock()/CLOCKS_PER_SEC);//只是为了测试一下程序运行的时间 143 return 0; 144 }