C++自存错题(10)阶乘之和(高精度)
用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。
其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。
思路:计算大数阶乘累加和
#include <iostream>
#include <cstring> // 用于memset初始化数组
using namespace std;
// 移除不必要的全局变量,仅保留必要的数组和长度
int a[5001], b[5001];
int N;
int len_a = 1; // 单独记录a数组的长度,避免混用
int len_b = 1; // 单独记录b数组的长度
// 修正后的阶乘计算+累加函数
void JieC(int N) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
a[1] = 1; // 1!的初始值(低位在前,a[1]是个位,a[2]是十位...)
for (int i = 1; i <= N; i++) {
// 步骤1:计算i! → a数组 = a数组 * i(大数乘法)
int carry = 0; // 进位变量
for (int j = 1; j <= len_a; j++) {
int temp = (int)a[j] * i + carry; // 用long long避免溢出
a[j] = temp % 10; // 当前位保留个位
carry = temp / 10; // 进位传递到下一位
}
// 处理乘法后的剩余进位(可能新增位数)
while (carry > 0) {
len_a++;
a[len_a] = carry % 10;
carry /= 10;
}
// 步骤2:将i!(a数组)累加到结果b数组(大数加法)
carry = 0;
int max_len = max(len_a, len_b);
for (int j = 1; j <= max_len; j++) {
long long temp = (long long)b[j] + a[j] + carry;
b[j] = temp % 10;
carry = temp / 10;
}
// 处理加法后的剩余进位
while (carry > 0) {
len_b++;
b[len_b] = carry % 10;
carry /= 10;
}
}
}
// 无需额外Qh函数,加法时已处理进位,此处仅统一len_b
void Qh() {
len_b = 1;
// 找到b数组的实际最大长度(避免前导0)
for (int i = 5000; i >= 1; i--) {
if (b[i] != 0) {
len_b = i;
break;
}
}
}
int main() {
cin >> N;
JieC(N);
Qh();
// 逆序输出(高位在前)
for (int i = len_b; i >= 1; i--) {
cout << b[i];
}
cout << endl;
return 0;
}
#牛客AI配图神器#
其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。
思路:计算大数阶乘累加和
#include <iostream>
#include <cstring> // 用于memset初始化数组
using namespace std;
// 移除不必要的全局变量,仅保留必要的数组和长度
int a[5001], b[5001];
int N;
int len_a = 1; // 单独记录a数组的长度,避免混用
int len_b = 1; // 单独记录b数组的长度
// 修正后的阶乘计算+累加函数
void JieC(int N) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
a[1] = 1; // 1!的初始值(低位在前,a[1]是个位,a[2]是十位...)
for (int i = 1; i <= N; i++) {
// 步骤1:计算i! → a数组 = a数组 * i(大数乘法)
int carry = 0; // 进位变量
for (int j = 1; j <= len_a; j++) {
int temp = (int)a[j] * i + carry; // 用long long避免溢出
a[j] = temp % 10; // 当前位保留个位
carry = temp / 10; // 进位传递到下一位
}
// 处理乘法后的剩余进位(可能新增位数)
while (carry > 0) {
len_a++;
a[len_a] = carry % 10;
carry /= 10;
}
// 步骤2:将i!(a数组)累加到结果b数组(大数加法)
carry = 0;
int max_len = max(len_a, len_b);
for (int j = 1; j <= max_len; j++) {
long long temp = (long long)b[j] + a[j] + carry;
b[j] = temp % 10;
carry = temp / 10;
}
// 处理加法后的剩余进位
while (carry > 0) {
len_b++;
b[len_b] = carry % 10;
carry /= 10;
}
}
}
// 无需额外Qh函数,加法时已处理进位,此处仅统一len_b
void Qh() {
len_b = 1;
// 找到b数组的实际最大长度(避免前导0)
for (int i = 5000; i >= 1; i--) {
if (b[i] != 0) {
len_b = i;
break;
}
}
}
int main() {
cin >> N;
JieC(N);
Qh();
// 逆序输出(高位在前)
for (int i = len_b; i >= 1; i--) {
cout << b[i];
}
cout << endl;
return 0;
}
#牛客AI配图神器#
全部评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享

