我最近试图通过我的书中的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;
}
这是代码本身,没有什么太花哨,因为它仍然是一个比较容易的练习,尝试设置变量作为一个寄存器,因为我听说它有时会使事情更快。Wolfram Alpha需要大约10秒来检查第100.000个素数,我的代码在这里需要大约90。提前感谢,Folling
4条答案
按热度按时间vxf3dgd41#
如果没有空间限制,请创建一个包含质数的向量,并按如下所示更改
checkPrime
方法:通过这种方法,你只需要检查n是否能被一个素数整除,而不是检查所有的数字直到它的平方根。
在这里,我们利用了一个数要么是素数,要么是一个或多个素数的倍数。
CheckPrime方法是
O(log n)
,因此查找前N个素数是O(n log n)
,其中n是第N个素数的值4si2a6ki2#
试试这个:
根据我的基准测试,对于n = 4000,这是一个超过2倍的优化,并且随着数字的增加而增加。
register
是贬值的。任何关于如何进一步优化的建议将是感激的。在n = 50000,在我的机器上需要24秒。axr492tv3#
这是一个很好的方法为您的演习和非常大的数字
}
pzfprimi4#
如果你需要的第n个素数计算它非常快。这个代码为你两个算法用于此
1.第一个算法是Meisel-Lehmer(Meisel-Lehmer非常快速地计算从1到n的素数计数)
1.第二种算法是二分查找