今天做到一道题,题目是求阶乘,本来实现并不难,可是运行后发现一个问题,由于阶乘的结果数字太大很容易溢出,我改定义成long long 类型也不能解决,40的阶乘甚至都无法计算,那么如何进行高精度的计算呢?
既然我们无法将数据以整数类型形式存放,那我们就可以将数据放入数组中,第j位数组数据代表结果的第j位
#include<iostream>
#include<cstring>
using namespace std;
int ans[100000],sum[100000];//定义两个全局变量 ,ans记录每次阶乘后的结果,sum记录每次阶乘和的结果
int main()
{
int n,i,j,k,len,lens=1,jin;
cin>>n;
for(k=1;k<=n;k++)
{
len=1;
jin=0;
memset(ans,0,sizeof(ans));
//memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化; 例如:memset(a,’\0’,sizeof(a));
ans[1]=1;
for(i=1;i<=k;i++)
{
for(j=1;j<=len*2;j++)
{
ans[j]=ans[j]*i+jin;//第j位代表高位进位,ans表示第j位
jin=ans[j]/10;
ans[j]%=10;
}
while(ans[len+1]!=0) len++;//更新第几位
}
for(i=1;i<=lens+100;i++)
sum[i]+=ans[i];//将第k次求解的结果放到sum中
for(i=1;i<=lens+100;i++)
{
if(sum[i]>=10)//每执行一次阶乘,更新一次sum,相当于求和
{
sum[i]-=10;
sum[i+1]++;
}
}
while(sum[lens+1]!=0)
lens++;
}
for(i=lens;i>=1;i--)
cout<<sum[i];
return 0;//输出sum值
}
将我们进位的过程拆解,存入数组当中;
一次拆解在阶乘部分,一次拆解在阶乘求和部分;
做了这个题以后对数组有了更深的理解。写下这篇博客做记录
有时间也会尽快自己总结一下关于cstring库的知识点到时候再替换这个链接喽