如何优雅地用C语言实现阶乘运算——四种方法
的有关信息介绍如下:对于C/C++初学者来说,可能会经常遇到如计算阶乘等问题。对于计算阶乘,一般人可能很轻易的就掌握了利用定义和循环来解决。但在博大精深的编程世界里,还有很多种实现阶乘的方法:如调用函数,利用递归,利用静态变量等等,掌握了这些,你的程序将更加优雅,更加高逼格~祝大家C语言学习愉快。
第一种:利用定义和for循环
试验:输入8,结果:8!=40320
程序代码如下:
//=======================
//原1.c
//利用定义实现阶乘
//-----------------------
#include
main()
{
int n,m=1,pro=1;//pro,即product,乘积
printf("Input n:");
scanf("%d",&n);
for(;m<=n;++m)
pro=pro*m;
printf("%d!=%d\n",n,pro);
}//===========================
第二种:调用函数
在C语言的模块设计中,可以利用定义和循环,设计一个专门计算阶乘的函数
fact(int),这样设计,以后如果遇到计算阶乘问题,可以直接套用函数,十分方便。
试验:输入 9,结果:9!=362880
程序代码如下:
//=======================
//原2.c
//调用函数实现阶乘
//-----------------------
#include
main()
{
int n;
int fact(int);//实现阶乘的函数
printf("Input n:");
scanf("%d",&n);
printf("%d!=%d\n",n,fact(n));
}
int fact(int n)
{
int pro=1;
int m=1;
for(;m<=n;++m)
pro=pro*m;
return(pro);
}//===========================
第三种,递归计算
在第二种调用函数的思想下,我们改进算法,利用递归运算,思路立马脱离了循环的桎梏
试验:输入10,结果:10!=3628800
程序代码如下:
//=======================
//原3.c
//利用递归实现阶乘
//-----------------------
#include
main()
{
int n;
int fact(int);//实现阶乘的函数
printf("Input n:");
scanf("%d",&n);
printf("%d!=%d\n",n,fact(n));
}
int fact(int n)
{
int pro;//pro,即product,乘积,
if(n<=1)
pro=1;
else
pro=n*fact(n-1);
return(pro);
}//===========================
第四种,利用静态变量实现阶乘
如果我们在C语言的学习更加深入一点,我们还会了解到静态变量(static)的特点,这时候利用静态变量实现阶乘也是别开生路。
试验:输入11,结果11!=39916800
程序代码如下:
//=======================
//原4.c
//利用静态变量实现阶乘
//-----------------------
#include
main()
{
int n,m=1,pro;
long fact(int);//实现阶乘的函数
printf("Input n:");
scanf("%d",&n);
for(;m<=n;m++)
pro=fact(m);
printf("%d!=%ld\n",n,pro);
}
long fact(int n)
{
static long pro=1;//pro,即product,乘积,
pro=pro*n;
return(pro);
}//===========================
总结:
由于阶乘是一个变化速度非常快的函数,对于较大数的阶乘的运算可能以上程序结果会溢出,这种情况下可以考虑把int型换成long型甚至是long long型;相应的,函数参数也要改动为 long fact(int),long long fact(int),long pro, long long pro,输出格式也要把第二个%d改为%ld。
但是,即便这样,仍不能解决大整数的阶乘问题,如1000!,在这种情况下我们还有更好的办法去处理,而这,将在后面的学习中学到。祝大家学习愉快。