【发布时间】:2017-03-06 22:28:25
【问题描述】:
我必须打印第 N 个素数。
例如:
第一个质数是 2
第二个质数是 3
.
.
第 10 个素数是 29,以此类推....
我的算法如下:
1) 将 2 和 3 添加到堆栈中。
2) 如果 n
3) 否则,从堆栈的最后一个元素开始,检查是否为素数
4) 要检查素数,请从堆栈中的每个元素中除。如果堆栈中任何元素的余数为 0,而不是素数。中断循环
5) 如果是 Prime,则添加到堆栈
6) 只搜索奇数
我的代码是:
#include <iostream>
using namespace std;
int main() {
int number, count = 0;
cin >> number; //position of prime number
int a[number];
a[0] = 2;
a[1] = 3;
int top = 1;
if (number <= 2) {
cout << a[number - 1] << endl;
} else {
for (int i = 5; i <= 10001; i += 2) {
for (int j = 0; j <= top; j++) {
if (i % a[j] != 0) {
count++;
}
if (count == (top + 1)) {
a[++top] = i;
if ((count + 1) == number) {
cout << a[top];
break;
}
}
}
}
}
return 0;
}
这段代码突然停止工作,没有给出任何输出。我的代码有什么缺陷?
【问题讨论】:
-
为什么,如果你总是以 2 为增量并且确保你的数字是奇数,那么要除以数组中的第一个数字?该检查是不必要的。
-
@LuisColorado 因为素数总是奇数...基本上是为了降低时间复杂度
-
@LuisColorado 但是这个代码对于更大的数字仍然需要时间。你能帮帮我吗?
-
我会手动或使用调试器检查代码,看看变量是如何设置的。尤其是变量计数。
-
您可以使用基于费马小定理的“强伪素性测试”,只需使用这些搜索字符串在 Google 上搜索即可。它们不是数学探针,而是概率性的,您可以根据需要减少误报的概率(例如,组成数字的一部分 y
1/10^2000)。这是加密软件通常使用的。并允许您测试长达数千位数的数字。