高精度計算

今天做到一道題,題目是求階乘,本來實現並不難,可是運行後發現一個問題,由於階乘的結果數字太大很容易溢出,我改定義成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頭文件的博客,點擊

有時間也會盡快自己總結一下關於cstring庫的知識點到時候再替換這個鏈接嘍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章