【问题标题】:Code to print Nth prime number打印第 N 个素数的代码
【发布时间】: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)。这是加密软件通常使用的。并允许您测试长达数千位数的数字。

标签: c++ algorithm primes


【解决方案1】:

int a[number]; 是错误的,因为number 不是常量。而是你想写成int *a=new int[number]

【讨论】:

  • 不,代码仍然无法正常工作......但我想 int a[number] 不是问题,我已经在许多其他代码中尝试过,它已经工作了
  • @macroland,恐怕在 C++ 中允许使用长度在运行时确定的自动数组。这个问题被标记为 C++ 而不是 C,所以我认为这不是一个错误。顺便问一下,这个答案是否解决了被问到的问题?
  • @LuisColorado:你说得对,我后来才意识到。
【解决方案2】:

你的循环逻辑有问题。您需要尝试将i 除以堆栈中从0 到top 的所有数字,并且只有当i 可以被任何一个 整除时,您才会增加计数。如果它不能被它们中的任何一个分割,那么你就是在增加它。

因此,更改逻辑以测试i 是否可被a[j] 整除。如果是,则跳出循环。如果你到达循环的末尾(j == top) 并且它没有成功划分它们中的任何一个,那么你知道它是素数,你可以增加count。此外,将 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。

【讨论】:

  • 先生,我得到 25 作为素数。第三个素数也显示为 7
  • 你需要初始化count = 2,我已经编辑了代码来说明它
猜你喜欢
  • 2023-01-30
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2018-07-07
相关资源
最近更新 更多