我必须打印第N个素数。
例如:
第一个素数是2
第二素数是3
。
。
第10个素数是29,依此类推......
我的算法如下:
1)添加2和3到堆栈。
2)如果n <=堆栈的大小,则在位置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;
}
此代码在没有提供任何输出的情况下突然停止工作。我的代码中存在哪些缺陷?
答案 0 :(得分:1)
循环逻辑存在问题。您需要对代码堆中i
到0
的所有数字进行top
的累计划分,并且只有当i
可以被 none 整除时他们你增加数量。因为它是在增加它,如果它们是不可分割的。
因此,更改逻辑以测试i
是否可被a[j]
整除。如果是,则打破循环。如果你到达循环的末尾(j == top)
并且它没有成功地划分它们中的任何一个,那么你知道它是素数,你可以增加count
。此外,您将比较计数top
的检查应该在j
循环之外(即在您完成所有试验分割之后)
for (int i = 5; i <= 10001; i += 2) {
for (int j = 0; j <= top; j++) {
if (i % a[j] == 0) {
break;
}
if(j == top)
{
count++;
a[++top] = i;
break;
}
}
if (count == number) {
cout << a[top];
break;
}
}
修改:您还需要将count
初始化为2而不是0,以便占据2和3。
答案 1 :(得分:0)
int a[number];
错误,因为number
不是常数。相反,您想将其写为int *a=new int[number]