🏆今日学习目标:
🍀学会阶乘之和题目
✅创作者:贤鱼
题目
用==高精度计算==出 !S=1!+2!+3!+⋯+n!(0n≤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。
代码
50分代码
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int s=1;
for(int j=1;j<=i;j++){
s*=j;
}
ans+=s;
}
cout<<ans;
}
这个应该是最基础的做法了,但是对于洛谷上只能拿到一半的分
AC代码
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans,a[1001],b[1001];
void c(int x){//高精度乘法
int g=0;
for(int i=100;i>=0;i--){
a[i]=a[i]*x+g;//直接乘
g=a[i]/10;//进位
a[i]%=10;//取出余数,相当于进位完剩下的
}
}
void j(){//高精度加法
int q=0;
for(int i=100;i>=0;i--){
b[i]+=a[i]+q;//这里直接加
q=b[i]/10;//进位处理
b[i]%=10;//同上
}
}
int main(){
cin>>n;
a[100]=b[100]=1;
for(int i=2;i<=n;i++){
c(i);
j();
}
int xy=0;//这里需要单独判断一下计算完的数字长度
for(int i=0;i<=100;i++){
if(b[i]){
xy=i; break;
}
}//以下直接输出就好
for(int i=xy;i<=100;i++){
cout<<b[i];
}
}
高精度计算
高精度加法
高精度乘法
以此类推
最后相加就好了
==🏆如果对您有帮助的话可以订阅一下专栏,持续跟新==