long
int的最大数值,1到16就已经溢出了,何况你的还是有符号的,比无符号的少差不多一半.
这个用递归实现的.
#include<stdio.h>
void
main()
{
int
fac(int
x)
unsigned
long
int
y
int
x
printf("请输入一个整数:")
scanf("%d",&x)
y=fac(x)
printf("%ld\n",y)
}
int
fac(int
x)
{
unsigned
long
int
y
if(x==1)
{
y=1
}
else
y=fac(x-1)*x
return
y
}
使用 unsigned long long 类型绝对的够了,下图是最后的运算结果:
unsigned long long 类型是C语言里面目前精度最高的数据类型,
double或者long double 虽然也占有8个字节,但是他们的实际精度只有53位,
而 unsigned long long 却有64位的精度,
具体的话,可以看我的帖子:
① C语言视频 VS2015:[7]基本数据类型:
http://jingyan.baidu.com/article/ceb9fb10c1abac8cad2ba0ca.html
② C语言视频 VS2015:[10]printf:
http://jingyan.baidu.com/article/8ebacdf021253d49f65cd539.html
希望对你有用,我是ndk吧吧主,有问题可以ndk吧留言,谢谢!
你求的不是20阶乘,20阶乘应该这么写long m = 1
for (int i = 1i <= 20++i)
{
m = m * i
}