高精度计算

今天做到一道题,题目是求阶乘,本来实现并不难,可是运行后发现一个问题,由于阶乘的结果数字太大很容易溢出,我改定义成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库的知识点到时候再替换这个链接喽

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