【noi】1.6_15:阶乘和
总时间限制: 1000ms 内存限制: 65536kB
描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=54321。
输入正整数N,输出计算结果S。
输入
一个正整数N。
输出
计算结果S。
样例输入
5
样例输出
153
#include<bits/stdc++.h>
using namespace std;
int s[67],f[66];
int main(){
int n,lenf=1,lens=0;
scanf("%d",&n);
memset(s,0,sizeof(s));
memset(f,0,sizeof(f));
f[1]=1;
for(int i=1;i<=n;i++){
//计算阶乘
int jin=0;
for(int j=1;j<=lenf;j++){
f[j]=i*f[j]+jin;
jin=f[j] / 10;
f[j]=f[j] % 10;
}
while(jin != 0){
lenf++;
f[lenf]=jin%10;
jin=jin/10;
}
//阶乘求和 ,加法
int jin1=0,len=lenf>lens?lenf:lens;
for(int m=1;m<=len;m++){
s[m]=s[m]+f[m]+jin1;
jin1=s[m] / 10;
s[m]=s[m] % 10;
}
if(jin1 != 0){
len++;
s[len]=1;
}
lens=len;
}
for(int i=lens;i>=1;i--){
printf("%d",s[i]);
}
return 0;
}
错误记录
//正确写法
int jin=0;
for(int j=1;j<=lenf;j++){
f[j]=i*f[j]+jin;
jin=f[j] / 10;
f[j]=f[j] % 10;
}
while(jin != 0){
lenf++;
f[lenf]=jin%10;
jin=jin/10;
}
//错误写法
if(jin != 0){
lenf++;
f[lenf]=jin;
}
计算阶乘的时候,需要考虑位数是否增加的情况。第一个for循环是指在位数没有增加的情况下做阶乘求每一位,如果最后又有进位,即jin!=0,说明数位需要增加,但是这里要注意,位数可能增加的不是一位,可能是两位或者多位,如果用下面的if语句,则就只会新增一位,如果上一步产生的进位是两位数,则会直接存在一个数组房间,会影响结果,原本阶乘的数应该是13位,则会变成12位,所以需要对进位产生的数进行分离数字的操作,相应的进位数字有多少位,就要新增多少位,即lenf自增多少次。
例子:
求1!到14!用if语句都没有什么问题,但是15!就会出错,如图,15!为1307674368000,因为是倒着输出,所以用if语句最后一个数组房间里的数字是13,而不是1。