大数运算——求阶乘
计算较为大的数字的阶乘使用的方法主要是利用一个辅助存储空间(数组)用于保存两个数字相乘后的每一位的结果。运算的原理就是小学学过的两位数乘法列竖式的每一位的计算过程,实际上就是将一个非常大的数字的乘法换成了两个小数相乘后再相加的过程,需要反复多次运算。
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!,对比一下代码和竖式的运算过程就一目了然了。