解题思路:阶乘和累加
没什么好说的
注意事项:是高精度
上代码
#include <cstdio>
int a[10000]; // 记录一个数的阶乘结果
int sum[10000]; // 记录1-n的阶乘的和
// 需要手动实现两种运算:
// 1. 阶乘(大整数、高精度)
// 2. 加法(大整数、高精度)
int jc(int n) { // 1. 阶乘(大整数、高精度)
int count = 1;
int add; // 进位
int cur; // 当前位(current 现在的)
a[0] = 1;
for(int i = 1; i <= n; i++) // 每一位乘以i
{
add = 0;
for(int j = 0; j < count; j++)
{
cur = a[j] * i + add; // 相乘 + 进位
add = cur / 10; // 进位
a[j] = cur % 10; // 当前
}
while(add) // 进位累加
{
a[count] = add % 10;
add = add / 10;
count++;
}
}
return count; // 返回当前阶乘的数位长度
}
void Add(int len) { // 2. 加法(大整数、高精度)
int t = 0;
for(int i = 0; i < len; i++)
{
t = t + sum[i] + a[i]; // 把a[i]加到目前的sum[i]上
sum[i] = t % 10;
t = t / 10;
}
if(t != 0) // 需要进位
sum[len] = t;
return;
// 没必要对a清零
}
int main()
{
int n;
scanf("%d", &n);
int len = 0; // 每次循环算出来的阶乘的最大的位数
for(int i = 1; i <= n; i++) {
int l = jc(i); // jc返回的是当前阶乘的数位长度
if(l > len) len = l;
Add(len);
}
for(int i = len - 1; i >= 0; i--)
printf("%d", sum[i]);
return 0;
}
注释都包含了,都还好就是Tab太坑了
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复