2014-09-03 47 views
-7

該算法輸入一個浮動值i,該值代表金額並返回支付該金額所需的最小硬幣數量並返回整數c。有人可以檢查算法

值C1 = 25,C 2 = 10,C 3 = 5,C4 = 1

我的代碼工作完全所有用於輸入除了當i = 4.2它應該返回18分的硬幣,而其返回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.使用調試器 – 2014-09-03 20:13:19

+1

哇,居中?我認爲GNU風格很難閱讀。 – 2014-09-03 20:14:01

+0

如果需要考慮等值,例如:else if(i> = 10 && i <25)',範圍是[ini,fin],開始時關閉,結束時開放。 – NetVipeC 2014-09-03 20:19:58

回答

2

你的問題是浮點精度。

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

打印:419.999969和不4.2因爲它應該,在這種情況下419是導致22枚硬幣的硬幣的問題使用的值使用16 of 251 of 101 of 54 of 1 = total 22

使用:i = round(i * 100);而不是i = i * 100;

您需要考慮相等的值,例如:else if(i> = 10 & & i < 25),範圍是[ini,fin),開始時關閉,結束時打開。如果您將else if更改爲if,則不需要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