1

これが入力の90%で機能するのに、他の入力では機能しない理由がわかりません。それはあなたが変化で何枚のコインを取り戻すかをあなたに伝えることを意味します。ほとんどのテスト金額は問題なく機能しますが、4.20(または$ 4.20)を入力すると、23コインが返されます... 18コイン(16クォーターと2ニッケル)である必要があります。バグはどこにありますか?これが私のコードです:

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

int main(void){

    float change = 0.00;

    printf("How much change is owed? ");
    change = GetFloat();

    float quarters = change/.25;
    change-= (int)quarters*.25;

    float dimes = change/.10;
    change-= (int)dimes*.10;

    float nickels = change/.05;
    change-= (int)nickels*.05;

    float pennies = (change+.005)/.01;
    change-=(int)pennies*.01;

    int total = (int)quarters+(int)dimes+(int)nickels+(int)pennies;

    printf("%d\n", total);

    return 0;
    }
4

3 に答える 3

6

に最も近いfloat4.20は、それよりもわずかに小さくなります(4.19999980926513671875、通常の32ビットIEEE754floatの場合)。したがって、16四半期から$ 4を差し引いた後、残りの金額は0.2よりわずかに少なくなります。これを0.1で割ると、値は2よりわずかに小さくなり、nickels値は1になります。同じことが起こり、ニッケルを引いた後、値は0.1よりわずかに小さくなり、0.05で割ると、商は2よりわずかに小さくなります。

セント単位で計算するこのような計算には、整数のみを使用する必要があります。

于 2012-10-29T19:55:25.307 に答える
2

浮動小数点の計算を破棄します。これはすべてせいぜい100分の1に基づいているので、整数の除算/モジュロを使用してください。浮動小数点数の完全な精度に依存しないでください。

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

int main(void){

    float fchange = 0.00;
    int change = 0;

    printf("How much change is owed? ");
    fchange = GetFloat();

    change = (int)roundf(fchange*100.0);

    int quarters = change/25;
    change = change % 25;

    int dimes = change/10;
    change = change % 10;

    int nickels = change/5;
    change = change % 5;

    printf("%d quarters, %d dimes, %d nickels, %d pennies\n", quarters, dimes, nickels, change);

    return 0;
}
于 2012-10-29T20:01:10.640 に答える
1

他の答えはほとんどカバーされています:ここでは浮動小数点ではなく固定小数点で作業する必要があります。ただし、浮動小数点入力から固定小数点表現に移行するときは、適切に丸めるように注意してください。これは私がハックした短いバージョンで、すべての肯定的な入力に対して機能するはずです。

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
    float change = atof(argv[1]);
    int work = (int)(100*change+0.5);
    int quarters, dimes, nickels, pennies;
    quarters = work/25; work %= 25;
    dimes    = work/10; work %= 10;
    nickels  = work/5;  work %=  5;
    pennies  = work;
    printf("%.2f dollars = %d quarters, %d dimes, %d nickels and %d pennies: %d coins total\n",
    change, quarters, dimes, nickels, pennies, quarters+dimes+nickels+pennies);
    return 0;
 }

例えば:

./change 4.20
4.20 dollars = 16 quarters, 2 dimes, 0 nickels and 0 pennies: 18 coins total
于 2012-10-29T20:10:45.553 に答える