2017-01-17 12 views
-1

Nリットルの水が与えられ、樽で輸送する必要があります。各バレルはXリットルの水を保持する。 NとXはともに正の整数です。 あなたの入力は2つの正の整数NとXで構成され、出力は水の輸送に必要なバレル数(M)です。XがNに均等に分裂しない場合の計算方法N

マイコード:

#include <stdio.h> 
int main(void) { 
    int N, X, M; 

    do { 
     printf("Please input a positive integer\n"); 
     scanf("%d%d", &N, &X);  
    } while (N, X < 0); 

    M = N/X; 

    printf("Total amount of water:%d\n", N); 
    printf("Barrel capacity:%d\n", X); 
    printf("%d barrels are needed\n", M); 

    return 0; 
} 

働く場合のサンプル実行:

Please input a positive integer 
Total amount of water:60 
Barrel capacity:5 
12 barrels are needed 

動作しない場合のサンプル実行:

Please input a positive integer 
Total amount of water:59 
Barrel capacity:5 
11 barrels are needed 

予想される出力2回目の実行は12ですが、私は11を取得します。Xがeを分割しない場合、どのように計算作業を行いますかvenlyにNに?私は59リットルのコードを見つけることができません。

+1

ここで問題は何ですか?あなたは59を入力し、出力は60であると言っていますか? – David

+1

整数部は床のように動作します。それはラウンドしませんし、それは天井になりません – demongolem

答えて

4

59リットルで動作するコードが見つかりません。

あなたのコードが60,12ではなく59,12で動作する理由は、整数で分割しているため残りをなくすことです。このような状況では、単純なアプローチが運ばれる必要がある水の量にバレルの能力のマイナス1を追加することです:

M = (N+X-1)/X; 

このトリックの作品、NXで割り切れるならば、結果が残っているために起こっているので、 NXで割り切れない状況では、追加の1が部分バレルの結果に追加されます。

注:ループ状態は、あなたとは思っていません:N, X < 0。それはN < 0 || X < 0である必要があります。

+0

潜在的なオーバーフローについてはどうですか? – EOF

+1

@EOF整数が最大値に近いときにこのアプローチが壊れることは確かですが、問題は整数分裂の影響を学生に教えることです。数値のオーバーフローを心配する必要がある場合、64ビットの「符号なしlong long」を使用すると、[Baikal lake](https://en.wikipedia.org)のボリュームを転送するのに必要なバレルの数を計算するのに十分です。/wiki/Lake_Baikal)を500回実行します。 – dasblinkenlight

関連する問題