我写了一个简单的贪婪算法,但不知何故它不起作用。
#include <stdio.h>
#include <iostream>
#include <conio.h>
int main(void)
{
float change;
std::cout << "Change: ";
std::cin >> change;
int quantity = 0;
while(change > 0.0){
if(change >= 0.5){
change -= 0.5;
}
else if(change >= 0.25){
change -= 0.25;
}
else if(change >= 0.1){
change -= 0.1;
}
else if(change >= 0.05){
change -= 0.05;
}
else if(change >= 0.01){
change -= 0.01;
}
quantity++;
std::cout << change << std::endl;
}
std::cout << quantity << std::endl;
_getch();
return 0;
}
虽然它适用于0.5和0.25,但它不适用于0.01或0.1。 (看起来它会返回一些非常小的数字) 我看不出问题出在哪里。
// EDIT 将所有内容转换为int值以避免下面提到的问题Zeno
答案 0 :(得分:4)
问题是基本的:0.5,0.25,0.125,......是'精确'浮点数0.1,0.01不是:你比较/减去是错误的。 在集合0.1 ... 0.9中,唯一的“精确”浮点数为0.5。
(所有这些都假定为二进制浮点数)
答案 1 :(得分:0)
当变化介于0.01和0.0之间时,你需要一个案例,也许避免最后的if()?
else if(change >= 0.05){
change -= 0.05;
}
else /*if(change >= 0.01)*/ {
change -= 0.01;
}