阶乘和(C++实现)

[NOIP1998P2]阶乘和

【时间限制】:1000ms    【内存限制】:65535KB

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入正整数N,输出计算结果S。

输入格式

输入正整数N

输出格式

输出计算结果S

样例输入

6

样例输出

873

本体虽然思路简单易想,但实际上代码实现对于初学者并不简单,在掌握高精度算法的同时要求对实际运算有较清晰的逻辑思维。(但毕竟小学生题,这么说才不是为了给自己做了半小时才ac找借口,哼╭(╯^╰)╮)

代码如下

#include<iostream> 
using namespace std;
int a[1010],jc[1010];
int al,cl;
void mul(int x)//阶乘,jc=jc*x 
{
	cl=cl+2;
	for(int i=0;i<cl;i++)//先相乘 
	    jc[i]=jc[i]*x; 
	for(int i=0;i<cl;i++)//再进位 
	{
		jc[i+1]+=jc[i]/10;
		jc[i]%=10; 
	}
	while(cl>1&&jc[cl-1]==0)//去除前导零 
	    cl--; 
}
void add()//相加 ,a=a+jc 
{
	al=max(al,cl);//求长度 
	for(int i=0;i<al;i++)//先相加 
	    a[i]=a[i]+jc[i];
	for(int i=0;i<al;i++)//再进位 
	{
		a[i+1]+=a[i]/10;
		a[i]%=10; 
	}
	while(al>1&&a[cl-1]==0)//去除前导零 
	    al--; 
} 
int main()
{ 
	cl=al=1;//赋值 
	jc[0]=1; 
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)//int版阶乘和形式,不改变原本基本运算逻辑,只将其改变为高精度算法 
	{
		mul(i);
		add(); 
	}
	for(int i=al-1;i>=0;i--)//输出a 
	{
		cout<<a[i]; 
	} 
	
	return 0; 
} 

 


            来源 [NOIP1998P2]

                                        (被嘲讽小学生题都做不出来,卑微笨仔在线补题)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值