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.这段代码思路借鉴了别的代码,如果认为是侵权的话,联系删帖