0

我正在编写一个程序来计算细菌菌落的生长直到某个点。

给定一个“X”,这将代表细菌的初始数量。并给出一个“Y”,这将代表细菌菌落中所需的细菌数量限制。返回细菌菌落达到限制所需的天数和小时数。

细菌菌落每小时增加一倍。

示例 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),请计算。

double从s 到s时,您可能需要解决精度问题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 回答
0

如果您执行以下操作,您可以使用 long int 一小时:

hour = counter - (day*24); // The total number of hours minus the number of hours that are in each day.

我面前没有编译器,但你也可以这样做:

hour = counter % 24; // this will return the remainder when counter is divided by 24.
于 2013-05-17T12:12:28.223 回答
0

如果 blimit 始终是二进制的倍数,则解决方案很简单:

counter%24将始终是整数,因此您不必四舍五入。如果是day几天和hour几小时,您只需要做的是:

hour = counter%24
于 2013-05-17T12:15:15.117 回答
0

关于计算方法的说明:如果每次只加倍,则不需要迭代。您只是在寻找 n 的值,这样2 n给出正确的结果。

所以,请注意ngenerations = log 2 blimit - log 2 binitial

一旦有了代数(作为浮点数),您就可以将其截断为整数小时数。

于 2013-05-17T12:17:23.720 回答