这是解决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
浮点数学运算可能很棘手,有关该主题的一些扩展讨论,请参见here。
您在desired>=0.01
中进行相等性比较,并期望0.01
满足条件true
。但是,这没有什么可依靠的,因为浮点运算带有舍入误差,并且并非每个实数都可以精确表示。 0.01
的最佳表示形式可能是0.0099999999999
。无论如何,请不要使用==
(或>=
)来比较浮点数。可以,而且会出错。
要修复它,您可以使用整数。您需要处理的数字似乎是整数除以100
。可能需要解析输入以将其直接转换为整数。或者,也许有一种更简单的方法。但是,由于这似乎是您的练习,所以我不想放弃完整的解决方案。