坚果


私信TA

用户名:dotcpp0615334

访问量:4701

签 名:

等  级
排  名 118
经  验 7884
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 xx
专  业

  自我简介:

TA的其他文章

解题思路:重点是写一个求高精度阶乘的函数出来

注意事项:每一次循环,要重新初始化数组的值。

参考代码:

#include

#include

//求阶乘的函数

int jiecheng(int *a,int n)

{

     int i,j,k,len=1;//len是数组的有效位数,一开始a[1]=1,所以数组有效长度为1

         for(i=1;i<=n;i++)//n是多少就是谁的阶乘,例如n=3,则此处求的是3的阶乘结果 

         {

             for(j=1;j<=len;j++)

             {

                 a[j]*=i;/*乘于i,例如 将数组a的每一位都乘于 i.例如:3的阶乘==》 数组a的每一位数*1后,进位后得1!;之后的数组a,每一位数*2,进位后得2!;之后的数组a,每一位数*3,进位后得3!,这里的a数组是不断变化的!!!*/ 

             }

             for(k=1;k<=len;k++)

             {

                 if(a[k]>9)

                 {

                     a[k+1]+=a[k]/10;//进位

                     a[k]%=10; 

                     if(a[k+1]!=0&&k==len) 

                     {

                        len++;//最高位要进位,数组要增加长度 //如例如len=2  a[1]=19 a[2]=9 则进位后a[1]=9 ,a[2]=9+1=10 ,a[2]进位后,a[2]=0 ,a[3]=1;此时len=3  

                     }

               }

         } 

  }

     return len;

}


int main()

{

int n;

scanf("%d",&n);

int i,j,k,t,max=0,sum[1000]={0},a[1000];

     for(i=1;i<=n;i++)//全部要求阶乘的数

     {

         memset(a,0,sizeof(a));//设定所有a数组的初始值为 0

         a[1]=1;//设定a[1]=1,因为乘法从a[1]开始。求阶乘就要设定a[1]=1;

         t=jiecheng(a,i);//求每一阶乘结果,而且结果是倒序 ,t 是阶乘结果的长度

         if(t>max)

         {

             max=t;//找最大的长度 ,max是sum数组的最大有效长度。

         }

    //阶乘结果相加

         for(j=1;j<=t;j++)

         {

             sum[j]+=a[j];//存储结果 

         } 

     }

         for(k=1;k<=max;k++)//结果转为十进制

         {

             if(sum[k]>9)

             {

                 sum[k+1]+=sum[k]/10;//进位 

                 sum[k]%=10;//本位

             }

        }

for(i=max;i>=1;i--)//输出

{

    printf("%d",sum[i]);

}

return 0;

 } 


 

0.0分

0 人评分

  评论区

  • «
  • »