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

#include<stdio.h>intmain(void){doubleb=1,s=0;inta;for(a=20;a>=1;a--){for(;a>=1;a--){b... #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;} 展开
 我来答
夏天的小红花

2019-09-15 · TA获得超过4804个赞
知道大有可为答主
回答量:1万
采纳率:83%
帮助的人:673万
展开全部

程序的问题很多。首先,用双精度变量保存总和,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;
}

shine1991
科技发烧友

2019-09-15 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部

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

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
源晨星6m
2020-04-16
知道答主
回答量:3
采纳率:0%
帮助的人:1802
展开全部

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
探花飞刀李
高粉答主

2019-09-15 · 醉心答题,欢迎关注
知道大有可为答主
回答量:3.9万
采纳率:50%
帮助的人:7338万
展开全部



看图片

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lu_zhao_long
2019-09-15 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.3万
采纳率:79%
帮助的人:2536万
展开全部
#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式