求1!+2!+3!+4!+5!........18!+19!+20!的C语言代码,我感觉我是对的呀,求问问题出在了哪里?

#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;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-09-15

#include <stdio.h>

int main(void)

{

    double b = 1, s = 0;

    int a, t;

    for (a = 20; a >= 1; a--)

    {

        for (t = a, b = 1; t >= 1; t--)

        {

            b = b * t;

        }

        s = s + b;

    }

    printf("%22.15e\n", s);

    return 0;

}

第2个回答  2020-04-16

最后结果不在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 的范围内。

第3个回答  2019-09-15



看图片

第4个回答  2019-09-15
#include <stdio.h>
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;
}
相似回答