C语言求阶乘

  • Post author:
  • Post category:其他


**



【C语言】求1! + 2!+ 3!+ … + 20!的和

**


本人小白,下面的程序或知识点如有错误,请大神赐教

首先理解这个问题:

!是一个运算符号指“阶乘”

1!=1×1

2!=1×2

3!=1x2x3

……

n!=n!=1×2×3×…×(n-1)×n(指从1乘以2乘以3一直乘到所要求的数)



方法0:

#include <stdio.h>
int main()
{
    int i,j;
    long long int num,sum=0;

    for(i=1;i<=20;i++)
    {
        num=1;
        for(j=i;j>0;j--)
        {
            num*=j;
        }
        sum+=num;
    }
    printf("%lld",sum);
    return 0;
}

运行结果:

在这里插入图片描述



遇到的问题:

  1. 为什么不能用int和long int,而是long long int?

    int类型和long int(占用4bytes)的取值范围是一样的:-2147483648 ~ +2147483647

    long long int类型(占用8bytes)的取值范围:-9223372036854775808~9223372036854775807

    该阶乘的和求得的值已经远远大于int和long int的取值范围(溢出)

    在这里插入图片描述

    运行结果:

    在这里插入图片描述

  2. 如果结果超出long long int类型的最大取值范围怎么办?(一般用不到)

    真的遇到可以用:无符号长整形unsigned long long (int)

    取值范围:0~1844674407370955161



方法1:

#include <stdio.h>
int main()
{
    int i,j;
    double num,sum=0;
    
    for(i=1;i<=20;i++)
    {
        num=1;
        for(j=i;j>0;j--)
        {
            num*=j;
        }
        sum+=num;
    }
    printf("%e",sum);
    return 0;
}

运行结果:

在这里插入图片描述



遇到的问题

  1. 为什么方法0和方法1求得的数据精度不一样?

    方法0求得的值是精确值,而方法1是以指数形式输出,C语言默认输出小数点后6位

    如果要更精确输出可以使用下面的输出代码
printf("%.18e",sum);



版权声明:本文为tiandada66原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。