我的代码在我的g ++编译器中运行,但不适用于我必须在SPOJ上提交的ideone

问题描述 投票:0回答:1

这是解决POJ上的问题的方法,我认为逻辑是正确的,但是我的解决方案在POJ编译器上不起作用,但是在我的g ++编译器上工作正常。我的解决方案出了什么问题。这是问题链接。http://poj.org/problem?id=1003

我试图去想错了,我认为poj如何获取输入输出以及我提供的方式是错误的。

#include<iostream>
#include<cstdlib>
using namespace std;

int main()
{
    float desired=1.00;
    while(1)
    {
        cin>>desired;
        if(desired!=0 and desired<=5.20 and desired>=0.01)
        {
            float sum=0;
            int denominator=2;
            float num=1;
            int total=0;
            while(sum<=desired)
            {
                num=1.00/denominator;
                sum+=num;
                total+=1;
                ++denominator;
            }
            cout<<total<<"\n";
        }
        else
            exit(0);
        }
    return 0;
}

我希望我的解决方案是正确的,但我不知道我哪里错了。我希望输出1卡输入的1张卡片0.040.010.01由于它将在0.00处终止,因此应提供两个输出,但仅给出一个输出。这是IDEONE上的输出链接http://ideone.com/1o6HAz

c++ c++11 gcc g++
1个回答
0
投票

浮点数学运算可能很棘手,有关该主题的一些扩展讨论,请参见here

您在desired>=0.01中进行相等性比较,并期望0.01满足条件true。但是,这没有什么可依靠的,因为浮点运算带有舍入误差,并且并非每个实数都可以精确表示。 0.01的最佳表示形式可能是0.0099999999999。无论如何,请不要使用==(或>=)来比较浮点数。可以,而且会出错。

要修复它,您可以使用整数。您需要处理的数字似乎是整数除以100。可能需要解析输入以将其直接转换为整数。或者,也许有一种更简单的方法。但是,由于这似乎是您的练习,所以我不想放弃完整的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.