李淳罡


私信TA

用户名:21020140218

访问量:2056

签 名:

一起刷题,一起变强

等  级
排  名 1381
经  验 2933
参赛次数 1
文章发表 7
年  龄 0
在职情况 学生
学  校 HNIT
专  业

  自我简介:

TA的其他文章

小菜鸡代码
浏览:430
小菜鸡代码
浏览:304
c语言——分治法
浏览:698

解题思路:
       阶乘和n,不同于高精度乘以高精度,我们这里逻辑更简单一点,具体看代码吧。这里提供两种思维,笔者的代码是前者。1,.我们定义两个数组,一个用来存一个数的阶乘和,一个用来保存最后的所有的和,比如b[1000],a[1000],这里b数组就可以存每一次的数的阶乘,每一次都加给数组a。所以每一次把b数组从1乘到相应的数就好了。2.前面和思维1方式一样,不同点是.....举个例子吧,比如现在b数组是2的阶乘和,下次你是不是只需要在乘一个3就是,3的阶乘和了。
注意事项:
       这里的两种思维如果你要用后者的话我们只需要把两个数组都定义成全局数组就行,每次调用函数只需要乘一个数就行。(本人是个小菜鸡,有什么说的不好的地方还请见谅,欢迎大家留言)

参考代码:

#include<stdio.h>

#include<string.h>

int a[3000]={0};         //我们先定义一个数组用来存最后n的阶乘和,当然这里的大小不一定为3000

void sort();

int poi();

int main()

{

    int n;

    scanf("%d",&n);      //读入数值n

    sort(n);            

    return 0;

}


void sort(int n)

{

    int i,p,k,m;

    for(i=1;i<=n;i++){

        m=poi(i);          //这里我们调用一个自定义函数分别求1-n的阶乘和

    }

    for(i=0;i<=m;i++){

        p=a[i]/10;         //因为我们没有给各个阶乘相加之后的数组清除大于10的数,所以我们要清一次

        a[i]%=10;          //这里只适合n比较小的情况下,n值大了就比需加一次请一次

        a[i+1]+=p;

        if(a[m+1]!=0)m++;

    }

    for(k=m;k>=0;k--){

        printf("%d",a[k]);   //最后我们输出数组的值就可以了

    }

}


int poi(int i)

{

    int b[3000]={1};        //这里嵌套调用的好处就是每一次用完数组的值就可以清零

    int n,m,k,j,p=0;

    m=0;                    //m表示我们当前位数

    for(n=1;n<=i;n++){       //这里开始就依次相乘了

        p=0;                

       for(k=0;k<=m;k++){

           b[k]*=n;         //每一个有实数的数组单位乘以n

       }

       while(p<=m){

           j=b[p]/10;

           b[p]%=10;         //这不是清楚数组单位大于10的数

           b[p+1]+=j;          

           if(b[m+1]!=0)m++;   //这里用来进位

           p++;

       }

    }

    for(i=0;i<=m;i++){

        a[i]+=b[i];          //调用n次次函数就会依次把1-n的阶乘都加给数组a

    }

    return m;                 //放回一个值表示数组b的长度

}


 

0.0分

3 人评分

  评论区

  • «
  • »