2017-08-16 11 views
2

私はCの新機能です。私はPythonの背景から来ています。私は自分のコードでどこが間違っていたのか知​​りたい。Cを学ぶには、 "欲張りな" CS50の解決策が必要です

私はcs50貪欲の問題を抱えています。私のコードで何が間違っていますか?それはいくつかの数字で動作しますが、他は動作しません。私はどのくらいの変更を返すようにユーザーからの入力を取得しようとしている$ 0.25、$ 10、$ .05、$ .01

#include <cs50.h> 
#include <stdio.h> 


int main(void) 
{ 
    float n; 
    do 
    { 
     n = get_float("How much change is owed?\n"); 
    } 
    while(n == EOF); 
    int minimumamountofcoins = 0; 
    if (n/.25 >=1){ 
     do 
     { 
      n -= .25; 
      minimumamountofcoins++; 
     } 
     while (n/.25 >= 1); 
    } 
    if (n/.1 >=1){ 
     do 
     { 
      n -= .1; 
      minimumamountofcoins++; 
     } 
     while (n/.1 >=1); 
    } 
    if(n/.05 >=1){ 
     do 
     { 
      n -= .05; 
      minimumamountofcoins++; 
     } 
     while (n/.05 >=1); 
    } 
    if (n/.01 >=1){ 
     do 
     { 
      n -= .01; 
      minimumamountofcoins++; 
     } 
     while (n/.01 >=1); 
    } 
    printf("The minimum amount of coins is %d\n", minimumamountofcoins); 
} 
を使用して返すことができるコインの最小数を計算する

新しいコード:(4.2を入力するとき以外は完璧に動作します)

#include <cs50.h> 
#include <stdio.h> 


int main(void) 
{ 
    float n; 
    do 
    { 
     n = get_float("How much change is owed?\n"); 
    } 
    while(n == EOF); 

    int cents = (int)(n * 100); 
    int minimumamountofcoins = 0; 
    if (cents/25 >= 1){ 
     while (cents/25 >= 1) 
     { 
      cents -= 25; 
      minimumamountofcoins++; 
     } 

    } 
    if (cents/10 >= 1){ 
     while (cents/10 >= 1) 
     { 
      cents -= 10; 
      minimumamountofcoins++; 
     } 
    } 
    if(cents/5 >= 1){ 
     while (cents/5 >= 1) 
     { 
      cents -= 5; 
      minimumamountofcoins++; 
     } 
    } 
    if (cents/1 >= 1){ 
     while (cents/1 >= 1) 
     { 
      cents -= 1; 
      minimumamountofcoins++; 
     } 
    } 
    printf("The minimum amount of coins is %d\n", minimumamountofcoins); 
} 
+0

はなぜあなたのコードが動作しないため、入力の例を与えない:

したがって、コードは次のようになりますか?その入力については、あなたが期待する出力とプログラムが返すものを言います。 –

+0

"変更"の質問を調査してください。アドバイスは、整数とセントで作業することです。 [浮動小数点数の計算は壊れていますか?](0120-13-0111) –

+1

いくつかの提案:整数を使用します(ペニーですべての金額を使用します)最後の.01 whileループが必要です(残量*はペニーの数です)。 "count"という単語全体を "amount"に置き換えてください。 – jarmod

答えて

1

あなたはテストケースが含まれていなかったので、私は自分自身をしました。

0.04、0.11、0.17、0.19、0.21、0.26、0.32、など

:ここにあなたのアルゴリズムは、正しい答えを返さないためにいくつかの例があります

最後のdo-whileループでペニーの数を計算すると、これらのケースはすべて失敗し、すべてコインを1つ戻します。これは、浮動小数点数のエラーが原因です。これは明らかに意図されていない

N/0.01 = 0.99999999

:print文で、私は最終的にペニーのための部門が計算されていたとき、同じことをするたびに発生したことを発見しましたこれは1に等しくなければならず、最後のペニーを合計に加えなければなりません。したがって、理論上で動作するコードは、浮動小数点数のために壊れています。これを避けるために

、あなたは、整数として別途ドルとセントを追跡するなど、物事の任意の数を、行うことができn/.01 >= .9999の代わりn/.01 >= 1する条件を変更する、あなたに上の計算を行っているお金の量を扱います整数のセント、または任意の他の数のものを含むことができる。

個人的には、金額をセントの整数で扱うという最後の選択肢を好みます。ドルからセントへの変換には100を掛けなければならないので、これは簡単です。したがって、最も簡単なことは、整数を使用する以外は同じアルゴリズムを使用することです。

int main(){ 
    float n; 
    //code that parses in the amount of money, n now stores that amount 
    int cents = (int)(n * 100); 
    int minimumamountofcoins = 0; 
    if (cents/25 >= 1){ 
     while (cents/25 >= 1) 
     { 
      cents -= 25; 
      minimumamountofcoins++; 
     } 

    } 
    if (cents/10 >= 1){ 
     while (cents/10 >= 1) 
     { 
      cents -= 10; 
      minimumamountofcoins++; 
     } 
    } 
    if(cents/5 >= 1){ 
     while (cents/5 >= 1) 
     { 
      cents -= 5; 
      minimumamountofcoins++; 
     } 
    } 
    if (cents/1 >= 1){ 
     while (cents/1 >= 1) 
     { 
      cents -= 1; 
      minimumamountofcoins++; 
     } 
    } 
    printf("The minimum amount of coins is %d\n", minimumamountofcoins); 
} 
+0

よろしくお願いします。 –

+0

うれしい私は助けることができました! – UnknowableIneffable

+0

もう1つ。それは受け入れていないようです4.2それは18でなければなりませんが、22を返す –