对于阶乘而言,有两种方法(可能不止两种)
一、递归方法
这个是最容易想的,如果是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;
}
本文介绍了两种计算大数阶乘的方法:递归方法和数组方法。递归方法简单直观但受限于数值精度;数组方法则通过数组存储每一位数字,支持大数阶乘计算。文章详细解释了数组方法的具体实现过程。
6640

被折叠的 条评论
为什么被折叠?



