【发布时间】:2017-03-16 02:02:32
【问题描述】:
我最近试图浏览我书中的 100 个不同练习的列表,目前是第 23 号。找到第 N 个素数,虽然这看起来很容易,但我注意到搜索更大的数字需要很长时间数字(又名 50000 大约需要 47 秒。
#include <iostream>
#include <time.h>
using namespace std;
bool checkPrime(int n);
int main()
{
while (true)
{
register int number;
cin >> number;
register int counter = 0;
register int numbers = 0;
time_t start = clock();
while (counter < number)
{
numbers++;
if (checkPrime(numbers))counter++;
}
double time_diff = (clock() - start);
cout << numbers << endl;
cout << "Time needed to process in ms: " << time_diff << endl;
}
}
bool checkPrime(int n) {
if (n <= 1) return false;
for (register int i = 2; i < n; i++) {
if (n%i == 0)return false;
}
return true;
}
这是代码本身,没什么花哨的,因为它仍然是更简单的练习之一,尝试将变量设置为寄存器,因为我听说它有时会使事情变得更快。 WolframAlpha 需要大约 10 秒来检查第 100.000 个素数,我的代码需要大约 90 秒。提前感谢 Folling
【问题讨论】:
-
埃拉托色尼筛是一种常见的方法来找到所有合理的小素数,直到某个限制。查一下,它很可能比你当前的实现要快。
-
提示:你的
checkPrime是 O(n),它可以很容易变成 O(sqrt(n))。 (这里的 n 是数字 n,而不是它的位数) -
@moreON 是正确的——我不久前写了一个 C 程序,它使用 Etatosthenes 的筛子解决了这个问题。找到第 100,000 个素数大约需要 16 毫秒,而找到第 100,000 个素数则不到 0.2 秒。您可以使用prime number theorem 计算所需的数字筛大小。
-
有空间限制吗?
-
这个已经讨论过很多次了...