大数阶乘思想(网上看的,部分改动)

本文介绍了两种计算大数阶乘的方法:递归方法和数组方法。递归方法简单直观但受限于数值精度;数组方法则通过数组存储每一位数字,支持大数阶乘计算。文章详细解释了数组方法的具体实现过程。

 

对于阶乘而言,有两种方法(可能不止两种)
一、递归方法
这个是最容易想的,如果是1的阶乘,则返回1,其他的都返回n-1的阶乘与n的积,循环调用即可。不过问题是即使用double来存放该值,由于double本身的精度、能存的数字大小所限,算不了太大的数的阶乘。
二、数组方法
思路:用data数组来存放阶乘的每一位数字,首先令第一位的数值为1(data[0] = 1),位数为1(digit = 1),然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。
例如求5!的值
步骤一:
1!=1
位数1
数组内容1

步骤二:
2!=2*1!=2
位数1
数组内容2

步骤三:
3!=3*2!=3*2=6
位数1
数组内容6

步骤四:
4!=4*3!=4*4=24
位数1
数组内容24
因为24大于10,需要进位
data[1]=data[1]+data[0]/10=0+2=2
data[0]=data[0]%10=4
所以数组内容为4      2
位数2

步骤五:
5!=5*4!=5*24=120
位数2
数组内容为4*5      2*5
即20      10
因为data[0]大于10,需要进位
data[1]=data[1]+data[0]/10=10+2=12
data[0]=data[1]%10=0
此时数组内容为0      12
data[2]=data[2]+data[1]/10=0+1=1
data[1]=data[1]%10=2
位数加1
数组内容为0      2      1
一次类推,可以计算大数的阶乘,代码如下:

 

#include<iostream>
using namespace std;
int main(){
 int data[10000],n,i,j,digit;
 while(cin>>n){
  for(i=1;i<10000;i++) data[i] = 0;
  data[0] = 1;
  digit = 1;
  for(i=2;i<=n;i++){
   for(j=0;j<digit;j++){
    data[j]*=i;
   }
   for(j=0;j<digit-1;j++){
    if(data[j]>9){
     data[j+1] += (data[j]/10);
     data[j] %= 10;
    }
   }
   while(data[digit-1] > 9){/*****data[digit-1]可能很大,有好几位,故用while*****/
    data[digit] += (data[digit-1]/10);
    data[digit-1] %= 10;
    digit++;
   }
  }
  cout<<n<<"!"<<endl;
  for(i=digit-1;i>=0;i--){
   cout<<data[i];
  }
  cout<<endl;
 }
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值