|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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>
复制代码
|
|