解题思路:用字符串或者数组都可以,但我觉得数组更好理解,虽然大部分同学都是用字符串写的。
注意事项:直接看代码注释,主要注意处理进位问题和前导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;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复