【noi】1.6_15:阶乘和

【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。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值