Code Bye

菜鸟请教为什么会得到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;
}

看不出有啥子问题
这样直接算阶乘,fact的结果会爆表吧。
注意题目说x是任意实数,那么当x很大的时候pow(x,i)就会超出double的范围了
直接算pow(x,i)/(t!)肯定会爆的。
我觉得应该分步计算,大致像是类似这样:x/(1*2*3)*x/(4*5)……但是又涉及到精度控制,我也没想好具体应该怎么做。
看来是一个数据范围的问题
引用 3 楼 brookmill 的回复:

直接算pow(x,i)/(t!)肯定会爆的。
我觉得应该分步计算,大致像是类似这样:x/(1*2*3)*x/(4*5)……但是又涉及到精度控制,我也没想好具体应该怎么做。

这是我同学的代码,感觉我的跟他的思路差不多,但为什么他提交就对而我却是错的呢,请问我们两个的代码哪里不一样呢?

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

40分
你们两个的代码,在输入“20 9”的时候结果不一样。
我把你的这一行  sum=sum+k*(shang/xia);
改成            fact = k*(shang/xia);    sum=sum+fact;
这样结果就一样了。
至于为什么,我也不知道,可能是浮点数计算的误差造成的。
引用 6 楼 brookmill 的回复:

你们两个的代码,在输入“20 9”的时候结果不一样。
我把你的这一行  sum=sum+k*(shang/xia);
改成            fact = k*(shang/xia);    sum=sum+fact;
这样结果就一样了。
至于为什么,我也不知道,可能是浮点数计算的误差造成的。

你好,按你的改了,但提交后还是Runtime Error,按OJ返回的这个结果可能是除数为0,但个人又觉得不太可能,请问你觉得会不会有可能


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明菜鸟请教为什么会得到runtime error