如何改进我的关于菌落生长的代码(c++)

How to improve my code about the growing of a bacterial colony (C++)

本文关键字:代码 c++ 生长 何改进 我的 于菌落      更新时间:2023-10-16

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

给定一个"X",表示细菌的初始数量。给出一个"Y",表示细菌群落中所需细菌的数量限制。返回细菌菌落达到极限所需的天数和小时数。

细菌菌落每小时加倍。

Example.1:

  • 输入:1,8
  • 输出:0,3

Example.2:

  • 输入:1000,1024000
  • 输出:0,10

Example.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;
}

您可以通过观察小时数为Log2(Y/X)来删除循环。要用标准函数计算Log2(A),计算log(A)/log(2)

当从double s到int s时,您可能需要解决精度问题,因为计算将是近似的。小时数的最终表达式可能如下所示:

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

从小时到天/小时也很简单:

cout << hours/24 << " " << hours % 24 << endl;

如果您执行以下操作,则可以使用长int表示hour:

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.

如果blimit总是binitial的倍数,解决方法很简单:

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

hour = counter%24

关于计算方法的注意事项:如果每次只是加倍,则不需要迭代。你只是在寻找一个n的值,使得2n给出正确的结果。

所以,注意ngenerations = log2 blimit - log2 binitial

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