洛谷题解P1009阶乘之和---C++

P1009阶乘之和

题目

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5×4×3×2×15!=5

输入格式

一个正整数N。

输出格式

一个正整数S,表示计算结果。

样例输入输出

输入:3
输出:9

解题思路

主要算法

高精度算法
高精度算法是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。------摘自百度百科
百度百科关于高精度算法的详细描述

思路介绍

因为题目中给出的最大的可能需要计算的数为50,因此超过了计算机的精度,因此需要利用高精度算法中乘法的计算方法来计算。
首先需要两个数组,其数组的下标设置的尽量大,以便不会超过范围。
然后只需要按照手算的方式,计算阶乘的时候,比如计算10的阶乘,先用1乘以所有位,然后用2乘以所有位,依次类推,直到用10乘以所有位,记录进位数和乘积的个位数,最后得出的结果即为数字10的阶乘,其他数同理,计算加法也是同理。

解决代码

#include<iostream>
using namespace std;
int jiecheng[1000]={0};//用来存放阶乘 
int sum[1000]={0};//用来存放从低位到高位依次相加后的结果  
void mutiply(int jiecheng[],int num)
{
 int i=0;
 int carrybit=0;
 for(i=1;i<1000;i++)
 {
  jiecheng[i]=jiecheng[i]*num+carrybit;
  carrybit=jiecheng[i]/10;
  jiecheng[i]=jiecheng[i]%10;
 } 
}
void pluss(int jiecheng[],int sum[])
{
 int i=0;
 int carrybit=0;
 for(i=1;i<1000;i++)
 {
  sum[i]=sum[i]+jiecheng[i]+carrybit;
  carrybit=sum[i]/10;
  sum[i]%=10;
 } 
}
int main()
{
 int n;
 int i=0;
 cin>>n;//需要求阶乘和的数
 jiecheng[1]=1;
 for(i=1;i<=n;i++)
 {
  mutiply(jiecheng,i);//先从低位开始计算阶乘 
  pluss(jiecheng,sum);//将和存入sum数组中 
 }
 int weishu=0;
 for(i=999;i>=1;i--)
 {
  if(sum[i]!=0)
  {
   weishu=i;
   break;
  }
 }
 for(i=weishu;i>=1;i--)
 {
  cout<<sum[i];
 }
 return 0;
 }

注意事项

在写这段代码的时候,遇到了几个问题
1.i只能为局部变量,全局变量会导致结果不正确
2.数组下标要尽量的大,避免遇到超过范围的情况
3.这段代码思路借鉴了别的代码,如果认为是侵权的话,联系删帖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值