首先看一个简单的使用递归算法的n!程序:
#include<iostream>
using namespace std;
long fac(int);
int main(){
int n;
cout<<"请输入数字n,将输出n!:"<<endl;
cin>>n;
long y=fac(n);
cout<<y<<endl;
return 0;
}
long fac(int n){
long f;
if(n<0){
cout<<"errro,请输入正数!!"<<endl;
return -1;
}
else if(n==0)
return 1;
else if(n==1) return 1;
f=n*fac(n-1);
return f;
}
显然,这个程序中的n是有上限的,当long占8字节的时候,f的取值范围是
-9223372036854775808~9223372036854775807;
所以诸如计算1000!的值是不可以用上述程序求解的。
当然,
由于位数的限制,没有任何编程语言,可以存储例如1000!这个乘法结果的量。解决的方法是采用数组来存储。
首先令数组的最后一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。
#include<iostream>
using namespace std;
int main()
{
int array_num[3000]; // 合适大小即可
int total,rem=0,count,ix; //rem 用来保存余数
for(ix=0;ix<3000;ix++)
array_num[ix]=0;
ix=2999;
array_num[2999]=1;
for(count=2;count<=100;count++)
{
while(ix>0)
{
total=array_num[ix]*count+rem;
rem=0;
if(total>9)
{
array_num[ix]=total%10;
rem=total/10;
}
else
array_num[ix]=total;
ix--;
}
rem=0;
total=0;
ix=2999;
}
for(ix=0;ix<3000;ix++)
{
if(array_num[ix]!=0 | count==1)
{
cout<<array_num[ix];
count=1;
}
}
}