如何计算在重复数字之前x必须在(x * y)%z中的高度

时间:2018-01-31 22:28:58

标签: c++ mod

我正在尝试计算出一个等式,用于计算下面的代码(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;
}

2 个答案:

答案 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分享一个。