我正在尝试计算出一个等式,用于计算下面的代码(y和z是常量)在开始重复之前运行的次数。
while (true) {
std::cout << (x * y) % z << std::endl;
x++
}
例如,当a为100且z为360时,代码将在输出再次变为0之前运行18次。
int y = 100;
for (int i = 0; i < 19; ++i) {
std::cout << y*i % 360 << std::endl;
}
答案 0 :(得分:1)
这称为最小公倍数。对于您的示例,x = 100和y = 3600的LCM是1800 / x =您的18。
从C ++ 17开始,std:lcm存在。
如果你不能使用它,请参考C++ algorithm to calculate least common multiple for multiple numbers进行一些实现,尽管你的可能比那些更简单,因为它们支持2个以上的输入。
答案 1 :(得分:1)
这更像是一个数学问题,而不是编程问题,但这里有:
你需要观察一个关键的事情:(A * B)如果A,B或A * B可被C整除而没有余数,则%C将为零。因此,您需要找到的一件事是最不常见的倍数。
示例:y = 5,z = 12.您的循环每12次迭代将产生0。在您的示例中,100/360 =&gt; 5 / 18.所以你需要x为18,因为5和18是互质的,即。 A * B需要为零。
有许多算法可以找到2个数字的最小公倍数。我将从here分享一个。