#include <stdio.h>int main(void){ double b=1,s=0; int a; for(a=20;a>=1;a--) { for(;a>=1;a--) { b=b*a; } s=s+b; } printf("%22.15e\n",s); return 0;}
程序的问题很多。首先,用双精度变量保存总和,20的阶乘本身就是一个19位数,但是双精度变量,只能有17位有效数字,所以说最后的数字是被丢失了的,只能保证小数点位置正确(后面丢失的数据位补0)。其次,程序中的双重循环,其中内循环的循环变量和外循环的循环变量,用的是同一个变量a,这在内循环循环时就把外循环的循环控制变量给破坏掉了,所以就不能正确地求出不同的阶乘数的总和。
#include<stdio.h>
int main()
{ long long n,i,s=0,t=1;
for(i=1;i<21;i++)
{t*=i;
s+=t;
}
printf("%lld\n",s);
return 0;
}
最后结果不在double精度范围内,用unsigned long long 定义结果变量比较好
还有就是你双层for循环有些浪费机器性能了,时间复杂度过高,一层for循环就够了
给你贴一个我的代码
#include <stdio.h>
int main(void)
{
int i;
unsigned long long sum1,sum2;
//sum1用来计算第i个数的阶乘,sum2则负责把各个数的阶乘累加起来
sum1 = 1, sum2 = 0;
for(i = 1; i <= 20; i++)
{
sum1 *= i;
sum2 += sum1;
}
printf("1!+2!+…+19!+20! = %llu\n",sum2);
return 0;
}
我的程序最后的结果是2,561,327,494,111,820,313
unsigned long long 类型可表示的最大数是 2 ^64 - 1 = 18,446,744,073,709,551,615
很明显,结果在unsigned long long 的范围内。