大数运算——求阶乘

大数运算——求阶乘

计算较为大的数字的阶乘使用的方法主要是利用一个辅助存储空间(数组)用于保存两个数字相乘后的每一位的结果。运算的原理就是小学学过的两位数乘法列竖式的每一位的计算过程,实际上就是将一个非常大的数字的乘法换成了两个小数相乘后再相加的过程,需要反复多次运算。

                    3     5
     X              5     6
     —————————————————————————
               2     1    0
        1      7     5 
   ———————————————————————————— 
        1     9      6     0   

整个运算过程实际上就是上面竖式的计算过程,35*56的运算过程被分解为较小的a*b和加法运算。数组中的内容则是存放的每一位上面的数字。
下面代码中的SC代表向前以为进位的数字大小。

int main(){

  const int MAXSIZE=100; //代表最大有100位用来存放结果
  int array[MAXSIZE]; 
  int n; //n代表要计算n的阶乘 n!
  cout<<"n=";
  cin>>n;
  int sum,sc;
  int i,j;
  for (int i = 0; i <MAXSIZE ; ++i)
      array[i]=0;

      array[0]=1;

      for (int i = 2; i <=n; ++i) {
          sc=0;
          for (int j = 0; j < MAXSIZE; ++j) {
              sum=array[j]*i+sc; //核心步骤:上一次进位值和当前计算结果求和
              sc=sum/10;//存放进位数值
              array[j]=sum%10;//求余数后存入对应的数组元素。
          }
      }
  cout<<n<<"!=";
      for(i=MAXSIZE-1;i>=0;i--){
          cout<<array[i];
      }

      cout<<endl;
  return 0;
}



测试用例:

n=50
50!=0000000000000000000000000000000000030414093201713378043612608166064768844377641568960512000000000000

注:假如看不懂代码就尝试计算5!,对比一下代码和竖式的运算过程就一目了然了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值