• 大数阶乘


    一个头疼的程序;计算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("
    ");
    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("
    ");
    62 } 

    1丶格式上,后者清晰明了,函数的声明,变量的定义,该空行的空行,而我唯一做到的只是该缩进的缩进了。

    2丶变量命名上,后者所用到的英文简易但明了,该用单词的就用单词,而我就是一堆的i,j,k,l,c;完全就看不懂。

    3丶以上两点直接决定了代码的可读性,易读性。后者是优秀代码,我的就是幼儿园刚学画画的。

    4丶内容上,后者代码结构严谨,每一个变量都考虑到了,灵活应用了函数,全局变量等简单基础,思维清晰。剖有标准风范,我的一看便是初学者。

    5丶结果上,后者严格按照题目要求,100就是100,可见其控制内存能力之强。我的就是随意啦,很不严格。

    综上所述,我的代码风格与思想需要重塑。

  • 相关阅读:
    简述Javascript中call apply
    tomato固件 路由简单玩 BT 电驴 amule highId python 其实dd wrt也一样 含 amule_2.2.61_mipsel.ipk下载
    Ubuntu10.10 下usb鼠标不动了
    Struts2源码分析 初步1 如何入手以及做了哪些初始化
    ubuntu eclipse easyexplore 替代品 open explorer
    struts2 src study 准备工作 和 略谈 如何读开源代码(Java)
    python 解析XML expat方式
    正则表达式基础 多选结构 加不加括号大不同
    UVa1586,Molar Mass
    UVa12100,Printer Queue
  • 原文地址:https://www.cnblogs.com/zzsf/p/3857574.html
Copyright © 2020-2023  润新知