用于打印第N个素数的代码

时间:2016-10-25 02:20:29

标签: c++ algorithm primes

我必须打印第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;
}

此代码在没有提供任何输出的情况下突然停止工作。我的代码中存在哪些缺陷?

2 个答案:

答案 0 :(得分:1)

循环逻辑存在问题。您需要对代码堆中i0的所有数字进行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]