如何改进我的关于菌落生长的代码(c++)
How to improve my code about the growing of a bacterial colony (C++)
我正在编写一个程序来计算细菌菌落的生长直到某一点。
给定一个"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
一旦你有了代数(作为浮点数),你可以将其截断为整数小时。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值