利用C语言求阶乘 例如求20! 用循环和函数两种方法……

 我来答
霜之咏叹调99
推荐于2017-12-16 · TA获得超过233个赞
知道小有建树答主
回答量:146
采纳率:0%
帮助的人:47.9万
展开全部
对于阶乘,你需要考虑到输入的数的大小,进行判断n<0,无阶乘;n==0||n==1阶乘为1;
n>1的就用户循环,或者调用函数来做
1.循环
#include<stdio.h>
void main()
{
float sum=1;
int n,i;
printf("please enter an integer number:");
scanf("%d",&n);
printf("\n");
if (n<0)
printf("n<0,data error!\n");
else if(n>1)
{
for(i=2;i<=n;i++)
sum=sum*i;
printf("%d!=%10.0f\n",n,sum);
}
else
if(n==0||n==1)
{
sum=1;
printf("%d!=%10.0f\n",n,sum);
}
}
2.函数
#include <stdio.h>
void main()
{
float fac(int n);
int n;
float y;
printf("input an integer number:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%10.0f\n",n,y);
}

float fac(int n)
{
float f;
if(n<0)
{
printf("n<0,data error");
}
else
if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return (f);
}
我已经匿名了
2011-08-15 · TA获得超过816个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:241万
展开全部
由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[]存储:
N=a[m]×10^(m-1)+a[m-1]×10^(m-2)+ … +a[2]×10^1+a[1]×10^0
并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5!=120,在数组中的存储形式为:
3 0 2 1 ……
对应:a[0] a[1] a[2] a[3]
首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。
计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次(即k个(k-1)!相加)后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。对应程序如下:
#include <stdio.h>
#include <malloc.h>
#define MAXN 1000
/*factorial:求k的阶乘:连续加(k-1)次(k-1)!,便得到了k!
结果保存在数组a中。a[0]为结果的位数,其后
下标从小到大表示阶乘的低位到高位
*/
void factorial(int a[],int k)
{
int *b,m=a[0],i,j,r,carry;
b=(int * ) calloc(m+1, sizeof(int));
for ( i=1;i<=m;i++) //保存a原来的值,用来加。a保存累加的结果
b[i]=a[i];
for ( j=1;j<k;j++) //上一次阶乘的值加(k-1)次
{
for ( carry=0,i=1;i<=m;i++) //从第一位开始,到最后一位止,依次加(k-1)!中对应数字
{//如果累加得到的位数m大于原来的位数a[0],多出来的位应不断加上进位的值
r=(i<=a[0]?a[i]+b[i]:a[i])+carry;
a[i]=r%10; //求余位
carry=r/10; //求进位的值
}
if (carry) a[++m]=carry; //最后一次处理
}
a[0]=m; //用新的位数值m来更新a[0],以防m有增加。
free(b);
}
/*printFactorial:打印数组a中保存的k的阶乘的结果*/
void printFactorial(int *a,int k)
{
int i;
printf("%4d!=",k);
for (i=a[0];i>0;i--) //从高位到低位打印阶乘的结果
printf("%d",a[i]);
printf("\n");
}
//主函数
int main()
{
int a[MAXN]={0},n,k;
printf("====用递推法求阶乘====\n");
printf("请输入正整数n: "); //输入n,求n!
scanf("%d",&n);
a[0]=1; //初始化,1的阶乘是1位
a[1]=1; //1!的值为1
printFactorial(a,1); //打印它的结果
for (k=2;k<=n;k++)
{
factorial(a,k); //利用上次的结果来求k!
printFactorial(a,k); //每次都打印k!
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
振云
2011-08-14 · 超过14用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:27.8万
展开全部
20的阶乘太大了,我求的是10的阶乘,你要很想求20的阶乘的话就用 long double试试
#include<stdio.h>
int main()
{
int i, k=1;
for(i=1;i<=10;i++)
{
k=k*i;
}
printf("k!=%d",k);
return 0;
}
下面是调用函数的
#include<stdio.h>
int jiecheng(int a)
{
int i,k=1;
for(i=1;i<=a;i++) k=k*i;
return k;
}
int main()
{
int a=10;
printf("k!=%d\n",jiecheng(a));
return 0;
}
其实
调用函数和上面的一模一样,这样做只是为了程序的客观性,你也可以定义静态变量,那样函数会简单些,不过有点难理解
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
beddy1
2011-08-14 · TA获得超过1988个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2186万
展开全部
比如待求阶乘的数为num,最后的结果放在sum中。
循环
int sum = 1;
for (int i = 2; i <= num; i++) sum *= i;
函数
int JieShen(int num)
{
if (num == 1) return 1;
else return num * JieShen(num - 1);
}
追问
sum *= i是什么……可以写得好点吗……谢谢……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-08-15
展开全部
1.
double sum=1;
int i;
for(i=1;i<=20;i++)
sum=sum*i;
printf("%.0lf",sum);

2.double f(int m)
{if(m<21)
return m*f(m+1);
else return 1;
}
int main()
{printf("%.0lf",f(1));
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式