#include<stdio.h>
void main()
{
double j=1
for(int i=1i<=50i++)j*=i
printf("1到100的阶乘是%.0f\n",j)
}
下面用函数的递归调用做:
#include<stdio.h>
double fact(int n)/*求阶乘的函数*/
{
double j
if(n>1)j=n*fact(n-1)/*递归调用,当n>1时,一直会调用下去,只不过每次参数被减1*/
else
return 1/*当n被减到1时,返回1,如是会被累积,当n初始为1时直接返回1*/
return j/*j是当n>1时,最后要的结果*/
}
void main()
{
printf("1到n的阶乘是%.0f\n",fact(5))
}
举例说明算法:1!+2!+3!+……+n!
=1+2*(1+3*(1+4*(1+5(1+.(1+(n-1)*(1+n)).))))
不过当n=100貌似会溢出.因此要实现一个大数乘法的函数。
#include<stdio.h>
void
main()
{
long
sum
int
n=100
sum=n
while(n!=1)
{
sum+=1
sum*=n-1//使用大数乘法函数替代这里的处理
n--
}
printf("%d\n",sum)
}
刚答过一个大数阶乘的,精确算到10000!没问题
#include <stdio.h>#define N 10000
int main()
{
static long int r[N] = { 1 }
int i, j,n
int k = 0, l = 0
printf("输入一个数求其阶乘\n")
scanf("%d", &n)
for (i = 1 i <= n i++)
{
for (j = 0 j <= l j++)
{
r[j] = r[j] * i + k
k = r[j] / 10000
r[j] = r[j] % 10000
}
if (k)
{
l++
r[j] = k
k = 0
}
}
j = l
printf("%d!=%d", i-1, r[j--])
for ( j >= 0 j--)
{
printf("%04d", r[j])
}
printf("\n")
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)