高手快来给我详细注释一下啊!
程序代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define N 21 void ncf(); void fun(); int z[10][N+1]; void main() { int start=time(NULL),end; printf("程序开始运行!\n"); ncf(); fun(); end=time(NULL); printf("这个程序共运行了%d秒!\n",end-start); } void ncf() { int temp,i,j,m; for(i=0;i<10;i++) { z[i][0]=1; } for(i=0;i<10;i++)/*分别求出1到9的21次方的值出来*/ { for(j=0;j<N;j++) { m=0; temp=0; for(m=0;m<N;m++) { temp=temp/10+z[i][m]*i; z[i][m]=temp%10; } } } for(i=0;i<10;i++)/*找到1到9的最高位,保存在每个数的z[i][N]*/ { for(j=N;j>=0;j--) if(z[i][j]!=0) break; z[i][N]=j+1; } /*for(i=0;i<10;i++) {printf("i=%d\n",i); for(j=0;j<N+1;j++) printf("%5d",z[i][j]); printf("\n"); }*/ } void fun() { int a[N]={0},b[N]={0},c[N]={0},d[10]={0},i,j,x,temp,f=0; a[N-1]=1; while(a[0]!=9) { //求和! for(i=0;i<N;i++) { temp=0; for(x=0;x<N;x++)//将二维数组进行求和运算。每列的结果存到b【x】(不知道这个解释是否对) { temp=b[x]+z[a[i]][x]+temp; b[x]=temp%10; temp=temp/10; if(temp==0&&x>=z[a[i]][N]) break; } } for(i=0;i<N;i++)//这个好像是统计b【1到9】出现次数; d[b[i]]++; x=0; for(i=0;i<10;i++) { for(j=0;j<d[i];j++) { c[x]=i; x++; } } f=0; for(i=0;i<N;i++) { if(a[i]!=c[i]) { f=a[i]-c[i]; break; } } ! if(f==0&&b[N-1]>=1&&b[N-1]<=9) { for(i=N-1;i>=0;i--) printf("%d",b[i]); printf("\n"); } for(i=N-1;i>0;i--) { if(a[i]!=9) break; } temp=a[i]; while(i<N) { a[i]=temp+1; i++; } for(i=0;i<N;i++) { b[i]=0; c[i]=0; } for(i=0;i<10;i++) { d[i]=0; } } }