标题:菜鸟请教为什么会得到runtime error
只看楼主
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
结帖率:100%
已结贴  问题点数:12 回复次数:9 
菜鸟请教为什么会得到runtime error
题目内容如下:



我提交后是runtime error,但我找不出哪里出错了,请教大神指点迷津,谢谢

我的代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
    int n,i,k,t;
    double x,sum,shang,xia,fact;

    while(scanf("%lf%d",&x,&n)==2)
    {
        i=1;
        k=1;
        sum=0;

        while(1)
        {
            fact=1;

            shang=pow(x,i);

            for(t=1;t<=i;t++)
            fact=fact*t;

            xia=fact;

            sum=sum+k*(shang/xia);

            if(shang<0)
                shang=-shang;

            if(shang/xia<pow(0.1,n))
                break;
            else
            {
                i=i+2;
                k=-k;
            }
        }

        printf("%.*lf\n",n,sum);

    }

    return 0;
}
搜索更多相关主题的帖子: include double shang 
2015-05-09 15:41
纳兰伽香
Rank: 10Rank: 10Rank: 10
来 自:北京
等 级:贵宾
威 望:10
帖 子:426
专家分:1650
注 册:2015-4-5
得分:0 
我运行正确

风回小院庭芜绿,柳眼春相续
2015-05-09 17:12
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
从35之后开始出错,建议检查下实现算法的语句。

能编个毛线衣吗?
2015-05-09 17:46
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
得分:0 
回复 3楼 wmf2014
你好,这是我同学的代码,感觉我的跟他的思路差不多,但为什么他提交就对而我却是错的呢,请问我们两个的代码哪里不一样呢?

#include<stdio.h>
#include<math.h>
int main()
{
    double sinx,x;
    int n;
    while(scanf("%lf%d",&x,&n)!=EOF)
    {
        double fenzi,fenmu,xiang,flag,k;
        int i,j;
        flag=-1;
        sinx=0;
        k=pow(10,-n);
        i=1;
        xiang=1;
        while(fabs(xiang)>=k)
        {
            flag=-1*flag;
            fenmu=1;
            fenzi=pow(x,2*i-1);

            for(j=1;j<=2*i-1;j++)
            fenmu=fenmu*j;

            xiang=flag*(fenzi/fenmu);

            sinx=sinx+xiang;
            i++;
        }
      printf("%.*lf\n",n,sinx);
    }
    return 0;
}

[ 本帖最后由 ma815841356 于 2015-5-9 23:52 编辑 ]
2015-05-09 23:51
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:12 
回复 4楼 ma815841356
你同学的答案一样是错误的,所不同的是他对误差的判断比你的好些,你的代码输入90 8后陷入死循环,你同学的没有死循环,但一样是错误答案。
50 8
55326.80857199
正确答案为:-0.262375

能编个毛线衣吗?
2015-05-10 06:25
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
得分:0 
回复 5楼 wmf2014
看来这个问题不简单哈,谢谢你的指点
2015-05-10 09:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
你和你同学的代码都是单独计算项的分子和分母。理论上这没错,但实际中由于计算机变量能表达范围的有限性,对于后面的项,这两个数非常大,很容易造成舍入误差和截断误差,尤其当x是个很大的数时。

同时这种计算本身也是存在大量重复,很浪费时间。

试一下这段代码
程序代码:
#include<stdio.h>
#include<math.h>

#define PI    3.1415926535897932384626433832795

int main()
{
    double x, xx, a, d, r;
    int n, i;
    
    for(; scanf("%lf%d", &x, &n) != EOF; printf("%.*f\n", n, r))
    {
        x = fmod(x, PI * 2);
        xx = -x * x;
        d = pow(10, -n);
        for(r = a = x, i = 1; fabs(a) >= d; r += a)
        {
            a *= xx;
            a /= ++i;
            a /= ++i;
        }
    }
    return 0;
}

重剑无锋,大巧不工
2015-05-11 09:08
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 7楼 beyondyf
有浮点数取余数的函数啊?我还是自己写的。

能编个毛线衣吗?
2015-05-11 09:12
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 8楼 wmf2014
标准库函数,是个编译器都有。姑娘有时间应该熟悉一下标准库。

重剑无锋,大巧不工
2015-05-11 09:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-445059-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.190673 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved