解题思路:
       阶乘和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.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论