解题思路:用字符串或者数组都可以,但我觉得数组更好理解,虽然大部分同学都是用字符串写的。

注意事项:直接看代码注释,主要注意处理进位问题和前导0,其他的和普通阶乘没什么区别

参考代码:

#include <stdio.h>

#define MAX 40000

int main() {

    int n;

    scanf("%d",&n);

    int num[MAX]= {0};//首先定义一个数组,进行初始化

    int i,j;

    num[0] = 1;把数组的第一位定义为1,因为后面要连乘

    if(n==1||n==0)

    {

        printf("1\n");

        return 0;

    }//0和1的阶乘都是1,单独列出来

    for( i = 2; i <= n; i++) {//从2开始,一直到n,依次地去连乘

        for( j=0; j<MAX; j++) num[j]*=i;//遍历数组让数组的每个单元都乘到

        for( j = 0; j < MAX-1; j++) {

            if(num[j]>9)

            {

                num[j+1] += num[j]/10;

                num[j] %= 10;//处理进位问题

//比如说12,12/10=1,就让前一位加上这个进位的1,12%10,就让本位保留2.

            }

        }

    }

    int start = MAX-1;

    while(start>0&&num[start]==0) start--;//找到最高位,不为0的那个数,去除前导0

    for( j = start; j >=0; j--) {//逆序输出

        printf("%d",num[j]);

    }

    printf("\n");

    return 0;

}


点赞(1)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论