使用C语言求N的阶乘的方法
用递归法求N的阶乘
程序调用自身称为递归(recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解.
递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
longfactorial(intn)
{
if(n==1)
return1;
else
returnn*factorial(n-1);
}
intmain(intargc,char*argv[])
{
intn=0;
if(argc!=2)
{
printf("inputerror,exit!!\n");
return-1;
}
n=atoi(argv[1]);
printf("%d!=%ld\n",n,factorial(n));
return0;
}
习题示例
题目
题目描述:
输入一个正整数N,输出N的阶乘。
输入:
正整数N(0<=N<=1000)
输出:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入:
4
5
15
样例输出:
24
120
1307674368000
AC代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX3000
//存储每次阶乘运算的结果
intstr[MAX];
voidcalculateFactorial(intn);
intmain()
{
intn;
while(scanf("%d",&n)!=EOF){
if(n==0){
printf("1\n");
}else{
calculateFactorial(n);
}
}
return0;
}
voidcalculateFactorial(intn)
{
inti,j,temp,c,len;
memset(str,0,sizeof(str));
str[1]=1;
for(i=2,len=1;i<=n;i++){//循环与2,3,..n相乘
for(j=1,c=0;j<=len;j++){//str数组代表一个数,模拟与i相乘
temp=str[j]*i+c;
str[j]=temp%10;
c=temp/10;
}
while(c>0)
{
str[j++]=c%10;
c/=10;
}
len=j-1;
}
for(i=len;i>=1;i--){
printf("%d",str[i]);
}
printf("\n");
}
/**************************************************************
Problem:1076
User:wangzhengyi
Language:C
Result:Accepted
Time:2150ms
Memory:916kb
****************************************************************/