2014-09-03 3 views
-7

이 알고리즘은 금액을 나타내는 부동 값 i을 입력하고 해당 금액을 지불하는 데 필요한 최소 동전 수를 반환하고 정수 c를 반환합니다.누군가 알고리즘을 검사 할 수 있습니까

값 내 코드가 i = 4.2은 18 개 동전을 반환해야하는 경우를 제외하고 입력에 대해 완벽하게 모든 일 1

은 오히려 반환 C1 = 25, C2 = 10, C3 = 5, C4 = 22 개 동전

i=i*100; 

while (i>0) { 
    if(i>=25) { 
     c = (int) i/25; 
     i= (int) i%25; 
    } 
    else if (i>=10 && i<25) { 
     c = c + (int) i/10; 
     i=(int) i%10; 
    } 

    else if(i>=5 && i<10) { 
     c = c + (int) i/5; 
     i = (int) i%5; 
    } 
    else if(i<5) { 
     c = c + (int) i/1; 
     i = (int) i%1; 
    } 
} 

printf("%d\n",c); 
+1

1. 형식이 읽을 수 있도록하는 코드. 2. 디버거 사용 –

+1

와우, 중심? 그리고 GNU 스타일을 읽기가 힘들다고 생각했습니다. –

+0

if 값이 같은 값을 고려해야 할 필요가 있습니다. else if if (i> = 10 && i <25), 범위는 [ini, fin]입니다. 처음에는 닫고 끝은 닫습니다. – NetVipeC

답변

2

부동 소수점 정밀도에 문제가 있습니다.

float i = 4.2; 
i *= 100; 
printf("%f\n", i); 

인쇄 : i = round(i * 100); : 419.999969하지 4.2 예상대로,이 경우 419 22 개 동전의 결과로 동전 문제에 사용되는 값이 16 of 25, 1 of 10, 1 of 54 of 1 = total 22

사용을 사용하다 대신 i = i * 100;

같은 값을 고려해야합니다. 예 : else if (i> = 10 & & i < 25), 범위는 [ini, fin]이며 처음에는 닫고 끝에 열립니다. else ifif으로 변경하면 while loop이 필요하지 않습니다.

최종 코드 :

#include <stdio.h> 
#include <math.h> 

int main() { 
    int c = 0; 
    float iv = 4.2; 
    int i = round(iv * 100); 

    printf("%d\n", i); 
    if (i >= 25) { 
     c += i/25; 
     i = i % 25; 
    } 
    if (i >= 10) { 
     c += i/10; 
     i = i % 10; 
    } 
    if (i >= 5) { 
     c += i/5; 
     i = i % 5; 
    } 
    if (i > 0) { 
     c += i; 
    } 
    printf("%d\n", c); 

    return 0; 
} 

더 많은 정보에 대한 What Every Programmer Should Know About Floating-Point Arithmetic

관련 문제