P1009 [NOIP 1998 普及组] 阶乘之和
时间限制: 1.00s 内存限制: 125.00MB
题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。
其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
这是C++代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
// 极简函数1:超大数字符串 + 1 (适配你的公式里的 total+1)
string strAddOne(string s) {
reverse(s.begin(), s.end()); // 反转,从个位开始算,方便进位
int carry = 1; // 要加的1,初始进位就是1
for(int i=0; i<s.size() && carry; i++) {
int num = s[i]-'0' + carry;
s[i] = num%10 + '0';
carry = num/10;
}
if(carry) s += '1'; // 最后还有进位,补1
reverse(s.begin(), s.end()); // 反转回来
return s;
}
// 极简函数2:超大数字符串 × 普通整数 (适配你的公式里的 *i)
string strMulInt(string s, int n) {
reverse(s.begin(), s.end());
string res;
int carry = 0;
for(int i=0; i<s.size(); i++) {
int num = (s[i]-'0')*n + carry;
res += num%10 + '0';
carry = num/10;
}
while(carry) { // 处理剩余进位
res += carry%10 + '0';
carry /= 10;
}
reverse(res.begin(), res.end());
return res;
}
int main() {
int num;
cin >> num;
string total = to_string(num); // 字符串存初始值,替代__int128
// ===== 你的原循环+原公式,一字未改!=====
for (int i = num - 1; i >= 1; i--) {
total = strMulInt( strAddOne(total) , i );
}
cout << total << endl; // 直接cout输出字符串,无需额外打印函数
return 0;
}
这是Python代码
n = int(input())
total = n
for i in range(1,n):
total = (total+1)*(n-i)
print(total)
Python秒杀一切高精度的题目