2016-06-16 44 views
3

我在EDX:計算機科學的Pset1上,並且在「改變時間」的最後。 在這裏你應該做一個代碼,一旦給出一個數字,應該找到你需要的最少數量的硬幣。 我已經讓我的代碼,但我似乎無法找到如何使它,所以它發現最低限度。這裏是我的代碼:我如何使它成爲我的代碼尋找最低金額的硬幣?

{ 
    printf ("How much do I owe you?\n");   //Get a non-negative number 
    float change = GetFloat(); 

    while (change < 0) 
    { 
     printf ("Please enter a non-negative number\n"); 
     change = GetFloat(); 
    } 

    int total = 0; 

    while (change >=.25) 
    { 
     change = change - .25; 
     total++; 
    } 
    while (change >=.1 && change <.25) 
    { 
     change = change - .1; 
     total++; 
    } 
    while (change >=.05 && change <.10) 
    { 
     change = change - .05; 
     total++; 
    } 
    while (change > 0 && change <.05) 
    { 
     printf ("%i\n", total); 
    } 

當我把在0.15,它給我的3回答,但應該說2 此外,一些其他的東西我做給我一個數字,但其不是最小值。 我怎樣才能使它始終找到最低金額?

+8

請注意浮點類型的擬似性錯誤。在這種情況下,我猜你不應該使用浮點值,而應該使用整數。 – MikeCAT

+2

(1)你最後的'while'循環看起來很亂。它應該減去.01並增加'total',而是打印總數。它可能是一個粘貼錯誤,但'printf'應該在循環之外。你可以用17美分來測試它(2)正如MikeCAT所說,浮點錯誤在這裏是一個問題。最好的解決方案是使用便士而不是美元,並將整數用於變量。所以1.00會變成100.然後你的算術將是確切的。當你把.15放在 –

+0

時。它處理兩個while循環,但在最後一個循環中,該值不是精確的0,它可能類似於0.000000001,或者浮點數可能有一些錯誤。 – mssirvi

回答

1

您應該做的第一件事是而不是使用浮點數來表示貨幣。涉及浮點數的算術運算不夠精確,無法用於貨幣。將其更改爲int。之後,您可以使用/%來計算硬幣的數量。

int amountOwed = ...;  // Amount owed in cents 

int total = amountOwed/25; // Number of quarters. 
amountOwed = amountOwed % 25; // Amount after the number of quarters. 

total += amountOwed/10; // Number of dimes. 
amountOwed = amountOwed % 10; // Amount after the number of dimes. 

total += amountOwed/5; // Number of nickels. 
amountOwed = amountOwed % 5; // Amount after the number of nickels. 

// Whatever is left is number of pennies. 
total += amountOwed; // Number of pennies. 
0

您正在嘗試使用浮點數跟蹤整數美分。這將永遠不會工作,因爲浮點是一個有限的精度表示方案,並不是你正在使用的每個值都可以精確表示。使用整數。

下面是一個類比來說明爲什麼這樣做不起作用。想象一下,如果我們有代表三分之一美元的硬幣,並且您使用的是五位十進制浮點數。一美元硬幣的三分之一將被表示爲「0.33333」。一美元當然是「1.00000」。問題是,當你從一美元三次減去三分之一硬幣時,你做而不是得到零,由於舍入誤差你會得到「0.00001」。

不要使用有限精度方案來表示它們無法準確表示的值,除非您不需要精確的結果。要指定硬幣的數量,您需要確切的結果。

1

候選路徑:

1)當比較float值考慮值的表示的像0.15不精確性爲float。最後,需要解決0.01的小數部分。

// while (change >=.1 && change <.25) 
min_unit = 0.01; 
while (change >= (0.10f - min_unit/2)) /* BTW: compare again 0.25 not needed */) 

2)將GetFloat()的返回值轉換爲最小貨幣單位的整數。

min_unit = 0.01; 
change = round(GetFloat()/min_unit); 

while (change >= 25.0) 
    .... 
while (change >= 10.0) 
    .... 

3)GetFloat()返回值轉換到最小貨幣單位的整。

min_unit = 0.01; 
long long Ichange = round(GetFloat()/min_unit); 

while (Ichange >= 25 /* min_units */) 
    .... 
while (Ichange >= 10 /* min_units */) 
    .... 

什麼是最好的取決於OP沒有給出的問題。數字範圍,除+,-,*以外的計算需要完成,複利,稅收等。

通常對於精簡程序,使用#3就足夠了。