1 Write a functionthatcalculates anumber'sfactorialusingrecursion
写出一个用递归来计算阶乘的函数。
这个很好写
#include <iostream>
using namespace std;
int factorial(int n){
if(n==1)return 1;
return n*factorial(n-1);
}
int main()
{
int n;
cin>>n;
cout<<factorial(n);
}
但是要注意,这个递归方法不能用来计算大整数的阶乘!!!因为结果的位数已经超过了整数表示的范围。
2 大整数的阶乘 如128!。。。
分析:1)属于大整数球阶乘,即使长整型也无法表示,128!大概有200多位。
2)想到用数组表示。
#include <iostream>
using namespace std;
const int MAX=3000;
int cnt=1;
void factorial(int index,int *result){
int product=0;//乘积
int carry=0;//进位
int remainder=0;//余数
for(int i=0;i<cnt;i++){
product=result[i]*index+carry;
carry=product/10;
remainder=product%10;
result[i]=remainder;
}
if(carry!=0){
while(carry/10!=0){
result[cnt]=carry%10;
carry/=10;
++cnt;
}
result[cnt++]=carry;
}
}
int main()
{
int n,index;
int result[MAX + 1];
result[0]=1;
cout<<"请输入所要求的阶乘数"<<endl;
cin>>n;
for(index=1;index<=n;++index){
factorial(index,result);
}
for(index=cnt-1;index>=0;--index){
cout<<result[index];
}
}
3 网上有位高手只用了四行代码:
不过看懂他的代码,有点烧脑筋啊!
#include <iostream>
using namespace std;
#include<stdio.h>
#define N 128 //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()
{
for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
s[a]=(b+=s[a]*t)%10000,b/=10000;
for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
return 0;
}