C++ 如何改进关于细菌菌落生长的代码(C+;+;)

C++ 如何改进关于细菌菌落生长的代码(C+;+;),c++,algorithm,C++,Algorithm,我正在编写一个程序来计算细菌菌落的生长直到某一点 给定一个“X”,表示细菌的初始数量。给出一个“Y”,表示菌落中细菌的数量限制。返回菌落达到极限所需的天数和小时数 菌落每小时翻一番 示例1: 输入:1,8 输出:0,3 例2: 输入:10001024000 输出:0,10 例3: 输入:1233453546624536 产出:1,10 如果计算的小时数返回小数,则必须向下舍入 到目前为止,我已经编写了以下代码: #include <iostream> using nam

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

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

菌落每小时翻一番

示例1:

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

  • 输入:10001024000
  • 输出:0,10
例3:

  • 输入:1233453546624536
  • 产出: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;
}
#包括
使用名称空间std;
int main(){
长整数二进制初始值,blimit,天,计数器=0;
浮动小时;
cin>>binitial;
cin>>blimit;

while(b初始如果执行以下操作,则可以使用长整型数持续小时:

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.
int hours = (log(Y/X) / log(2)) + 1E-8; // Add a small delta

如果执行以下操作,则可以使用长整数表示小时:

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.
int hours = (log(Y/X) / log(2)) + 1E-8; // Add a small delta

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

计数器%24
将始终是一个整数,因此不必对其进行四舍五入。 如果是
天和
小时
小时,您只需执行以下操作:

hour = counter%24

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

计数器%24
将始终是一个整数,因此不必对其进行四舍五入。 如果是
天和
小时
小时,您只需执行以下操作:

hour = counter%24

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

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

hour = counter % 24; // this will return the remainder when counter is divided by 24.
int hours = (log(Y/X) / log(2)) + 1E-8; // Add a small delta
从几小时到几天/几小时也很简单:

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

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

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

hour = counter % 24; // this will return the remainder when counter is divided by 24.
int hours = (log(Y/X) / log(2)) + 1E-8; // Add a small delta
从几小时到几天/几小时也很简单:

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

cout关于计算方法的说明:如果每次只翻一倍,则无需迭代。您只需寻找n的值,以便2n给出正确的结果

因此,请注意ngenerations=log2blimit-log2bininitial


一旦你有了生成数(作为一个浮点数),你就可以把它截短成一个小时的整数。

关于计算方法的一点说明:如果你每次只翻一倍,你就不需要迭代。你只需要寻找一个n的值,这样2n就可以给出正确的结果

因此,请注意ngenerations=log2blimit-log2bininitial


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

我已编辑了您的问题的格式。它缺少的是一个实际的问题。此代码是否可以工作并给出正确的答案,但您希望它更整洁?或者它是否给出错误的答案?或者在运行时爆炸?或者编译失败?您需要什么帮助?我的代码正在返回righ我没有回答,但是,我想开始改进我的代码,比如减少行数,改进组织,消除冗余和不必要的过程,让它更清晰,使用更多的数学等等。我已经编辑了你的问题的格式。它缺少的是一个实际的问题。这段代码是否有效并给出了正确的答案,但你希望它是b更整洁?或者它给出了错误的答案?或者在运行时爆炸?或者编译失败?您需要什么帮助?我的代码返回了正确的答案,但是,我想开始改进我的代码,比如减少行数、改进组织、消除冗余和不必要的过程、使其更清晰、使用更多的数学等等……而您不应该这样做需要担心计数器%24返回的不是整数,因为计数器永远不会是整数。好的,但您可以有1/3、1/4、1/2…小时,对吗?有这种可能性,您可能会在小时变量中遇到实数。小时变量是否可以接收实数(例如30M=1/2小时,所以小时=0.5)你是对的-但你只做过计数器++;如果你做的是计数器+=0.5或什么的,那么你会得到1/2小时,等等。是的,现在我明白了!你在这一点上是对的。你不必担心计数器%24只返回整数,因为计数器永远不会是整数。好的,但你可以有1/3,1/4,1/2…小时,对吗?有了这种可能性,你可能会在小时变量中遇到实数。小时变量是否可能收到实数(例如30M=1/2小时,所以小时=0.5)你是对的,但你只做了计数器++;如果你做的是计数器+=0.5或什么的,那么你最终会有1/2个小时,等等。是的,现在我明白了!你在这一点上是对的。这是这里最强的解决方案,但如果他最终尝试每小时做一次运算,他将需要循环。+1用于数学!+1用于mThs!很好的解决方案,它将使代码更容易理解。这是这里最强的解决方案,但如果他最终尝试每小时做一次操作,他将需要循环。+1用于数学!+1用于数学!很好的解决方案,它将使代码更容易理解。很好