大数阶乘
一个头疼的程序;计算100以内的阶乘。
这是我的程序,可计算10000以内的阶乘:
1 /*Small factorials*/ 2 3 #include<stdio.h> 4 int fact(int n); 5 void print(int len); 6 7 int F[200]; 8 9 int main(){ 10 int len,n=1; 11 while(n!=99){//若输入99则退出 12 scanf("%d",&n); 13 len=fact(n); 14 print(len); 15 } 16 } 17 18 int fact(int n){ 19 int i,j,k,m,len; 20 for(i=0;i<200;i++) 21 F[i]=0; 22 F[0]=1; 23 len=1; 24 for(i=1;i<=n;i++){ 25 m=0;k=0; 26 for(j=0;j<len;j++){ 27 k=F[j]*i+m; 28 F[j]=k%10000; 29 m=k/10000; 30 if(m>0&&j==len-1) 31 len++; 32 } 33 } 34 return len; 35 } 36 37 void print(int len){ 38 int j; 39 printf("%d",F[len-1]); 40 for(j=len-2;j>=0;j--) 41 printf("%.4d",F[j]); 42 printf("\n"); 43 }
结果虽然正确,但参考了别人的算法,自己想了很久还是不行,最后弄完后总算松了口气。
直到我看到下面这个程序,才发现我的代码就是一堆狗屎。
优秀的代码:
1 /*Small factorials*/ 2 3 #include<stdio.h> 4 5 void fact(short int); 6 void print(void); 7 8 short int factorial[80]; 9 short int length; 10 11 int main() 12 { 13 short int i,n,t; 14 scanf("%d",&t); 15 for(i=1;i<=t;i++) 16 { 17 scanf("%d",&n); 18 fact(n); 19 print(); 20 } 21 return 0; 22 } 23 24 void fact(short int n) 25 { 26 short int i,j,sum,temp; 27 for(i=1;i<80;i++) 28 factorial[i]=0; 29 factorial[0]=1; 30 length=1; 31 for(i=2;i<=n;i++) 32 { 33 j=temp=0; 34 while(j<length) 35 { 36 sum=temp+factorial[j]*i; 37 factorial[j]=sum%100; 38 j++; 39 temp=sum/100; 40 } 41 while(temp>0) 42 { 43 factorial[j++]=temp%100; 44 temp/=100; 45 length++; 46 } 47 } 48 } 49 50 void print(void) 51 { 52 short int i; 53 printf("%d",factorial[length-1]); 54 for(i=length-2;i>=0;i--) 55 { 56 if(factorial[i]>=10) 57 printf("%d",factorial[i]); 58 else 59 printf("0%d",factorial[i]); 60 } 61 printf("\n"); 62 }
1丶格式上,后者清晰明了,函数的声明,变量的定义,该空行的空行,而我唯一做到的只是该缩进的缩进了。
2丶变量命名上,后者所用到的英文简易但明了,该用单词的就用单词,而我就是一堆的i,j,k,l,c;完全就看不懂。
3丶以上两点直接决定了代码的可读性,易读性。后者是优秀代码,我的就是幼儿园刚学画画的。
4丶内容上,后者代码结构严谨,每一个变量都考虑到了,灵活应用了函数,全局变量等简单基础,思维清晰。剖有标准风范,我的一看便是初学者。
5丶结果上,后者严格按照题目要求,100就是100,可见其控制内存能力之强。我的就是随意啦,很不严格。
综上所述,我的代码风格与思想需要重塑。