2013-09-02 4 views
0

나는 간단한 greedy 알고리즘을 작성했지만 어떻게 든 작동하지 않는다.간단한 욕심 많은 알고리즘. 무한 루프

#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 가 문제가 당신은 변화가 0.01와 0.0 사이 인 경우 필요

+0

매개 변수 목록으로 볼 때 유효한 것은 유효하지 않습니다. 또한 main()은 일반적인 argc/argv와 선택적으로 envp를 가져야합니다. –

+0

사용자가 '0.001'을 입력하면 예상되는 출력은 무엇입니까? – Kevin

+8

통화 계산에 부동 소수점을 사용하지 마십시오. 그것부터 시작하십시오. – WhozCraig

답변

4

문제는 초등학교입니다 : 당신은/빼기가 잘못 비교 : 0.5 반면, 0.25, 0.125, ... '정확한'부동 소수점 숫자 0.1, 0.01이 아니다. 집합 0.1 ... 0.9에서 유일한 '정확한'부동 소수점은 0.5입니다.

(모든 것은 이진 부동 소수점을 가정합니다)

+0

필수 링크 : [모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – AShelly

0

Zeno 아래에 언급 피하기 위해 값을 int로 모든 변환, 어쩌면) (경우 마지막을 피하기?

else if(change >= 0.05){ 
     change -= 0.05; 
    } 
    else /*if(change >= 0.01)*/ { 
     change -= 0.01; 
    }