【发布时间】:2021-05-16 23:38:32
【问题描述】:
我想在一系列只能被 2、3 和 5 整除且不能被任何其他素数整除的数字中找到第 n 个数字。
这是我找到第 1500 个数字的最简单解决方案。这需要大约 16 秒来执行。我想知道是否有办法让它更快,比如使用多线程。
#include <iostream>
using namespace std;
int main()
{
int temp, seriesCounter = 1, currentNumber = 2;
while (seriesCounter < 1500)
{
temp = currentNumber;
//Remove all multiple of 2
while (temp % 2 == 0)
{
temp /= 2;
}
//Remove all multiple of 3
while (temp % 3 == 0)
{
temp /= 3;
}
//Remove all multiple of 5
while (temp % 5 == 0)
{
temp /= 5;
}
// If only 1 remains, the number is valid, else not.
if (temp == 1)
{
seriesCounter++;
}
currentNumber++;
}
cout << "The 1500th number in the series is : " << --currentNumber << endl << endl;
return 1;
}
【问题讨论】:
-
你可以考虑重新组织它,这样你就可以枚举一堆三元组
(m, n, q)并查看2^m * 3^n * 5^q的值。可能需要仔细考虑如何将它们放回正确的顺序,但这意味着您不会花时间考虑一堆不在序列中的数字。 -
我不知道,但可能有一些巧妙的数学公式可以解决 O(1) 中的问题。如果没有,请考虑使用筛选算法或某种记忆。现在你正在重复很多工作。
-
2、3 和 5 的倍数形成一个模式,每 30 个数字重复一次。不幸的是,要确定哪些倍数不能被另一个素数整除并不容易。
-
如果您想获得关于工作代码的反馈,您可以向codereview.stackexchange.com 提问。
标签: c++ multithreading optimization c++14