C++中计算50内的阶乘之和
P1009 阶乘之和 - 洛谷// #include<bits/stdc++.h>
#include <iostream>
#include <vector>
using namespace std;
// 计算两个大数相加
vector<int> add(const vector<int>& a, const vector<int>& b) {
vector<int> result;
int carry = 0; // 进位
int i = a.size() - 1; // 大数位数
int j = b.size() - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry;
if (i >= 0) sum += a;
if (j >= 0) sum += b;
result.insert(result.begin(), sum % 10);
carry = sum / 10;
}
return result;
}
// 计算大数乘以一个整数
vector<int> multiply(const vector<int>& num, int x) {
if (x == 0) return {0};
vector<int> result = num;
int carry = 0;// 进位
// 从最低位开始乘
for (int i = result.size() - 1; i >= 0; i--) {
int product = result * x + carry;
result = product % 10;
carry = product / 10;
}
// 处理剩余进位
while (carry > 0) {
result.insert(result.begin(), carry % 10);
carry /= 10;
}
return result;
}
int main() {
int n;
cin >> n;
vector<int> s = {0};// 总和,从0开始
vector<int> fact = {1};// 当前阶乘值
for (int i = 1; i <= n; i++) {
fact = multiply(fact, i);// fact 每乘一次就是一个阶乘,即 i!
s = add(s, fact); // 累加到总和s = 1! + 2! + ... + n!
}
for (auto digit : s) {
cout << digit;
}
return 0;
}cpp难啊{:10_266:} 您好!关于计算50内阶乘之和的问题,由于阶乘数值很大,需要使用大数运算。以下是修复和完成后的C++代码,使用vector来处理大数相加和相乘。
代码中的主要修复:
- 添加了必要的头文件。
- 在add函数中修复了索引访问和递减逻辑。
- 完成了main函数中的循环和输出。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
// 大数相加函数
vector<int> add(const vector<int>& a, const vector<int>& b) {
vector<int> result;
int carry = 0;
int i = a.size() - 1;
int j = b.size() - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int digitA = (i >= 0) ? a : 0;
int digitB = (j >= 0) ? b : 0;
int sum = digitA + digitB + carry;
result.insert(result.begin(), sum % 10);
carry = sum / 10;
if (i >= 0) i--;
if (j >= 0) j--;
}
return result;
}
// 大数乘以整数函数
vector<int> multiply(const vector<int>& num, int x) {
if (x == 0) return {0};
vector<int> result = num;
int carry = 0;
for (int i = result.size() - 1; i >= 0; i--) {
int product = result * x + carry;
result = product % 10;
carry = product / 10;
}
while (carry > 0) {
result.insert(result.begin(), carry % 10);
carry /= 10;
}
return result;
}
int main() {
int n;
cin >> n;
vector<int> s = {0};// 初始化总和为0
vector<int> fact = {1};// 初始化阶乘为1
for (int i = 1; i <= n; i++) {
fact = multiply(fact, i);// 计算i的阶乘
s = add(s, fact);// 将阶乘加到总和
}
// 输出结果
for (int digit : s) {
cout << digit;
}
cout << endl;
return 0;
}
使用方法:
- 输入一个整数n(例如50),程序会计算1!到n!的和。
- 由于使用大数运算,可以处理n up to 50的情况。
如果您有任何疑问,请随时提出!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 哈哈哈哈我用python 秒的{:10_256:} 记忆犹新 某一个“天” 发表于 2025-8-26 20:21
哈哈哈哈我用python 秒的
{:10_284:}
页:
[1]