0

我写了一个简单的贪心算法,但不知何故它不起作用。

#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的问题

4

2 回答 2

4

问题很简单:虽然 0.5, 0.25, 0.125, ... 是“精确”浮点数,但 0.1、0.01 不是:您比较/减去是错误的。在集合 0.1 ... 0.9 中,唯一的“精确”浮点数是 0.5。

(所有这些都假设二进制浮点)

于 2013-09-02T20:52:59.297 回答
0

当变化在 0.01 和 0.0 之间时,您需要一个案例,也许避免最后一个 if()?

    else if(change >= 0.05){
        change -= 0.05;
    }
    else /*if(change >= 0.01)*/ {
        change -= 0.01;
    }
于 2013-09-02T20:49:06.550 回答