2016-10-07 9 views
-1

私はcs50xをやっていて、私の仕事で困っています。私は変更を返すために必要な硬貨を最小限に抑えるアルゴリズムを作成することになっています。例えば0.41ドルは4コイン、0.25ドル、2ドル、(0.10)、そして1セント(0.01ドル)です。何らかの理由でこのアルゴリズムが機能していない(コインの数が間違っています)アウト理由:私は、コードを実行したとの回答は4ことになっているとき、私は3枚のコインを持って、支払うべき金額として0.41を使用C - 私の欲張りアルゴリズムが動作していません。CS50x

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

int Coins; 
float Owed; 

int main(void) 
{ 
    printf("How much is owed?\n"); 
    Owed = GetFloat(); 
    while (Owed < 0) 
    { 
     printf("A positive number please"); 
     Owed = GetFloat(); 
    } 
    if (Owed >= 0.25) 
    { 
     while (Owed >=0.25) 
     { 
      Owed = Owed - 0.25; 
      Coins++; 
     } 
    } 

    if (Owed >= 0.1) 
    { 
     while (Owed >=0.1) 
     { 
      Owed = Owed - 0.1; 
      Coins++; 
     } 

    } 

     if (Owed >= 0.05) 
    { 
     while (Owed >=0.05) 
     { 
      Owed = Owed - 0.05; 
      Coins++; 
     } 

    } 

     if (Owed >= 0.01) 
    { 
     while (Owed >= 0.01) 
     { 
      Owed = Owed - 0.01; 
      Coins++; 
     } 

    } 
    printf("%d",Coins); 
} 

GreedyNotWorkTerminalPage

+0

デバッガの使用方法と、変数とその値を監視しながらコードを1行ずつ進める方法を学びます。 –

+0

各コインの値をループするのではなく、モジュロ算術を使用してみませんか? – Chimera

答えて

0

あなたは2/3 4-として正確な表現を持っていないことをまったく同じ方法で、フロートのような正確な表現を持っていない数字(0.1、0.05、0.01)を使用しています小数点以下の10進数。 Cは最も近いfloat値を代わりに使用するので、エラーは非常に小さいですが、それは予期せず比較を失敗させるのに十分です。フロートは、4桁の10進だった、とあなたは2/3 1ドル硬貨を持っていた場合

は想像:

  1. スタート> = 0.6667負っ負っ= 2.0000
  2. で、Owed- = 0.6667なります。 Now Owed = 1.3333
  3. 1.3333> = 0.6667、したがってOwed- = 0.6667。 Now Owed = 0.6666
  4. おっと! Owed = 0.6666ですが、NOT> = 0.6667

これを修正するには、少し丸め誤差を許容するように比較を変更します。その代わり>=0.245>=0.095を使用し、>=0.25>=0.1、および>=0.01を言って、そして>=0.005

は通常、しかし、それは正確にあなたが使用したい値を表すことができますタイプを使用することをお勧めします。のfloatドルの代わりにintセントを使用してください。

2

あなたがfloatを使用して、このような操作の正確性を失う可能性があることに注意する必要があります。これを見てください:Floating point inaccuracy examples

代わりにintを使ってセントで作業することをお勧めします。

Coliru example

関連する問題