**
【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;
}
运行结果:
遇到的问题:
-
为什么不能用int和long int,而是long long int?
int类型和long int(占用4bytes)的取值范围是一样的:-2147483648 ~ +2147483647
long long int类型(占用8bytes)的取值范围:-9223372036854775808~9223372036854775807
该阶乘的和求得的值已经远远大于int和long int的取值范围(溢出)
运行结果:
-
如果结果超出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;
}
运行结果:
遇到的问题
-
为什么方法0和方法1求得的数据精度不一样?
方法0求得的值是精确值,而方法1是以指数形式输出,C语言默认输出小数点后6位
如果要更精确输出可以使用下面的输出代码
printf("%.18e",sum);
版权声明:本文为tiandada66原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。