解题思路:阶乘和累加
没什么好说的
注意事项:是高精度
上代码
#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二级辅导-统计字符 (C语言代码)浏览:528 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:932 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:566 |
剪刀石头布 (C语言代码)不知道怎么直接在scanf中用枚举变量浏览:1435 |
打水问题 (C语言代码)浏览:1147 |
WU-printf基础练习2 (C++代码)浏览:2061 |
sizeof的大作用 (C语言代码)浏览:1590 |
循环入门练习6 (C语言代码)浏览:1058 |
大神老白 (C语言代码)浏览:637 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:839 |