关于C语言求1!+2!+...20!值的问题
本帖最后由 Wanng 于 2021-1-22 19:52 编辑用int和float两种类型定义变量,为什么最后结果却不同。个人认为1到20都是整数,应该不存在精度问题(不知道这么想对不对)。代码如下:
代码一:
#include<stdio.h>
void main()
{
float n,s=0,t=1;
for(n=1;n<=20;n++)
{
t*=n;
s+=t;
}
printf("1!+2!+...+20!=%f\n",s);
}
输出结果为1!+2!+...+20!=2561327455189073900.000000
代码二:
#include<stdio.h>
int factorial(int a) //阶乘函数
{
int s;
if(a==1)
s=1;
else
s=a*factorial(a-1);
return s;
}
void main()
{
int i,sum=0;
int factorial(int a);
for(i=1;i<21;i++)
{
sum = sum+factorial(i);
}
printf("1!+2!+...+20!=%d\n",sum);
}
输出结果为1!+2!+...+20!=268040729
本帖最后由 jackz007 于 2021-1-22 20:35 编辑
int 的最大值是 2147483647,看看浮点数的位数,显然,已经远远超限,发生溢出了,结果当然不对,两个值根本就无法比。
unsigned long long 的最大值是18446744073709551615 这个应该可以。
#include<stdio.h>
unsigned long long factorial(unsigned long long a) //阶乘函数
{
unsigned long long s ;
if(a == 1) s = 1 ;
else s = a * factorial(a - 1) ;
return s ;
}
int main(void)
{
unsigned long long i , sum = 0 ;
for(i = 1 ; i < 21 ; i ++) sum = sum + factorial(i) ;
printf("1!+2!+...+20!=%I64u\n" , sum) ;
}
编译、运行实况
D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
1!+2!+...+20!=2561327494111820313
D:\00.Excise\C>
页:
[1]