今天做到一道題,題目是求階乘,本來實現並不難,可是運行後發現一個問題,由於階乘的結果數字太大很容易溢出,我改定義成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庫的知識點到時候再替換這個鏈接嘍