求1!+2!+3!+4!+5!........18!+19!+20!的C语言代码,我感觉我是对的呀,求问问题出在了哪里?
最后结果不在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 的范围内。
int main(void)
{
double b=1,s=0;
int a;
for(a=1;a<=20;a++)
{
b=b*a;
s=s+b;
}
printf("%22.15e\n",s);
return 0;
}