Wanng 发表于 2021-1-22 19:51:30

关于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:33:25

本帖最后由 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]
查看完整版本: 关于C语言求1!+2!+...20!值的问题