(1)循环法
#include <iostream>
using namespace std;
long fac(int); //函数声明
int main( )
{int n; //n为需要求阶乘的整数
long y; //y为存放n!的变量
cout<<"please input an integer :"; //输入的提示
cin>>n; //输入n
y= fac(n) ; //调用fac函数以求n!
cout<<n<<"!="<<y<<endl; //输出n!的值
return 0;
}
long fac(int n)
{ long f;
int i;
if(n<0)
{cout<<"n<0,data error! "<<endl; //如果输入负数,报错
f=-1;} //并以-1作为返回值
else if (n==0||n==1) f=1; //0!和1!的值为1
else //n>1时,使用循环语句来求解
{
for(i=1,f=1;i<=n;i++)
f=f*i;
}
return f; //将f的值作为函数值返回
}
(2)递归函数法
#include <iostream>
using namespace std;
long fac(int); //函数声明
int main( )
{int n; //n为需要求阶乘的整数
long y; //y为存放n!的变量
cout<<"please input an integer :"; //输入的提示
cin>>n; //输入n
y= fac(n) ; //调用fac函数以求n!
cout<<n<<"!="<<y<<endl; //输出n!的值
return 0;
}
long fac(int n) //递归函数
{ long f;
if(n<0)
{cout<<"n<0,data error! "<<endl; //如果输入负数,报错
f=-1;} //并以-1作为返回值
else if (n==0||n==1) f=1; //0!和1!的值为1
else f=fac(n-1)*n; //n>1时,进行递归调用
return f; //将f的值作为函数值返回
}
此方法用递归调用方式,要想使用递归调用必须是前后项有递推关系,并且有终止条件。递归方法简化了设计,易于编程和理解,让复杂的嵌套调用留给计算机去做,但递归调用降低程序效率。
(3)静态局部变量法
输出1~5的阶乘值(即1!,2!,3!,4!,5!)。
#include <iostream>
using namespace std;
int fac(int); //函数声明
int main( )
{int i;
for(i=1;i<=5;i++)
cout<<i<<"!="<<fac(i)<<endl;
return 0;
}
int fac(int n)
{static int f=1; //f为静态局部变量,函数结束时f的值不释放
f=f*n; //在f原值基础上乘以n
return f;
}
此方法有局限性,此局限性在于要求n!,必须从1!,2!。。。(n-1)!依次计算下来,才能求出n!。
(4)大数阶乘---利用数组实现
/*大数阶乘
小数阶乘在整数表示范围内可以表示出来,但对于大数阶乘超过数的表示范围
利用数组计算大数阶乘
*/
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int MAXSIZE=200;
int array[MAXSIZE];
int n;
cout<<"n=";
cin>>n;
//计算n!的位数len
double mul=1;
int len=1,i;
for(i=1;i<=n;i++)
{
mul=mul*i;
}
while(mul>=10.0) //获取阶乘结果的位数
{
len++;
mul/=10;
}
cout<<"n!共有位数:"<<len<<endl;
int sum,sc;
int j;
for(i=0;i<len;i++)
array[i]=0;
array[0]=1;
for(i=2;i<=n;i++)
{
sc=0;
for(j=0;j<len;j++)
{
sum=array[j]*i+sc;
array[j]=sum%10;
sc=sum/10;
}
}
cout<<n<<"!=";
for(i=len-1;i>=0;i--)
cout<<array[i];
cout<<endl;
return 0;
}