零的执行人 发表于 2020-2-6 17:52:21

一个测试点一直不通过


求幂级数展开的部分和
已知函数e的x次方可以展开为幂级数1+x+x ​2 ​​/2!+x ​3 ​​/3!+⋯+x ​k ​​/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求e的x次方的近似值,求和一直继续到最后一项的绝对值小于0.00001。
输入格式: 输入在一行中给出一个实数x∈。
输出格式: 在一行中输出满足条件的幂级数部分和,保留小数点后四位。
输入样例:
1.2
输出样例:
3.3201
#include <stdio.h>
#include "math.h"
#define N 10
int main()
{
    int i=0,k=1,j;
    double s=1,s1=1.0,item=1,x;
    double a={0};
    double eps=0.00001;
    scanf("%lf",&x);
    if(x>=0&&x<=5){
    for(i=1;i<=9;i++){
      a=pow(x,i);
    }
    while(fabs(item)>eps){
      for(j=1;j<=k;j++){
            s1=s1*j;
      }
      item=a/s1;
      s=s+item;
      k++;
      s1=1.0;

    }
    printf("%.4lf",s);
    }
    return 0;
}

结果貌似没有问题,但是有一个测试点一直不通过,求大佬给看看哪里有问题?是while的执行条件控制有问题还是理解什么的有问题?QAQ

召唤风云 发表于 2020-2-6 19:08:12

你的数学公式写的好丑。看不懂。可以写在纸上拍照片发过来吗?或者换一种方式表达。

alexw_h264 发表于 2020-2-9 10:07:29

召唤风云 发表于 2020-2-6 19:08
你的数学公式写的好丑。看不懂。可以写在纸上拍照片发过来吗?或者换一种方式表达。

你的N设置小了。因为k超过了9.导致while语句里面a溢出了。将N修改成20,并将for(i=1;i<=9;i++){ 修改成for(i=1;i<N;i++){。程序可以稳定运行,测试通过

alexw_h264 发表于 2020-2-9 10:08:03

修改后的代码

#include <stdio.h>
#include "math.h"
#define N 20
int main()
{
    int i=0,k=1,j;
    double s=1,s1=1.0,item=1,x;
    double a={0};
    double eps=0.00001;
    scanf("%lf",&x);
    if(x>=0&&x<=5){
                for(i=1;i<N;i++){
      a=pow(x,i);
    }
    while(fabs(item)>eps){
      for(j=1;j<=k;j++){
            s1=s1*j;
      }
      item=a/s1;
      s=s+item;
      k++;
      s1=1.0;

    }
    printf("%.4lf",s);
    }
    return 0;
}

零的执行人 发表于 2020-2-9 20:10:08

alexw_h264 发表于 2020-2-9 10:07
你的N设置小了。因为k超过了9.导致while语句里面a溢出了。将N修改成20,并将for(i=1;i

嗯嗯是溢出了,20也有点小,至少22。我还有一个疑问,就是N=25,27这样的奇数所有测试点就会出现运行时错误的情况。。。N如果设置为22,24,30的偶数,测试就通过了请问是为什么呀?

alexw_h264 发表于 2020-2-9 21:02:05

如果你的输入是1.2的话,k会到11,不会超过20的。

22对应的是哪个输入?另外,N=25等出错时,对应的是什么输入?

零的执行人 发表于 2020-2-9 23:14:17

alexw_h264 发表于 2020-2-9 21:02
如果你的输入是1.2的话,k会到11,不会超过20的。

22对应的是哪个输入?另外,N=25等出错时,对应的是什 ...

刚试了下本地运行,Dev上N=20其实足够了。但是在OJ上不知道为什么就是过不了,估计是OJ评定标准不一样啥的。。。谢谢啦
页: [1]
查看完整版本: 一个测试点一直不通过