解题思路:阶乘和累加
没什么好说的
注意事项:是高精度
上代码
#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语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:522 |
多输入输出练习1 (C语言代码)浏览:1189 |
printf基础练习2 (C语言代码)浏览:646 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:474 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)from DQM浏览:671 |
Tom数 (C语言代码)浏览:495 |
生日日数 (C语言代码)浏览:1502 |
老王赛马 (C++代码)浏览:905 |
简单的a+b (C语言代码)浏览:641 |