0

特定の時点までの細菌コロニーの成長を計算するプログラムをコーディングしています。

「X」を指定すると、それは細菌の初期数を表します。そして、与えられた「Y」は、細菌コロニー内の細菌の望ましい数の制限を表します. 細菌コロニーが限界に達するまでに必要な日数と時間数を返します。

細菌のコロニーは 1 時間ごとに 2 倍になります。

例1:

  • 入力: 1、8
  • 出力: 0、3

例 2:

  • 入力: 1000 、1024000
  • 出力:0、10

例 3:

  • 入力: 123、3453546624536
  • 出力: 1、10

計算された時間が小数を返す場合は、切り捨てる必要があります。

これまでのところ、私はこのコードを書いています:

#include <iostream>

using namespace std;

int main(){

    long int binitial, blimit, day, counter=0;
    float  hour;

    cin >> binitial;
    cin >> blimit;

    while(binitial <= blimit){
        binitial = binitial * 2;
        counter++;
    }

    day = counter / 24;
    cout << day << " ";
    hour = (counter % 24) - 0.5;
    cout << (int)hour;
    return 0;
}
4

4 に答える 4

3

時間数が Log 2 (Y/X) であることを観察することで、ループを取り除くことができます。標準関数を使用してLog 2log(A)/log(2) (A) を計算するには、 を計算します。

計算が概算になるため、sからdoubles に移動する場合、精度の問題に対処する必要がある場合があります。int時間の最終的な表現は次のようになります。

int hours = (log(Y/X) / log(2)) + 1E-8; // Add a small delta

時間から日/時間への移行も非常に簡単です。

cout << hours/24 << " " << hours % 24 << endl;
于 2013-05-17T12:15:25.173 に答える