【问题标题】:Program to generate nth prime number生成第 n 个素数的程序
【发布时间】:2017-05-04 10:09:43
【问题描述】:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
main()
{
clrscr();
int num,b,c,d,f,primeset[500],j=0;
cout<<"Enter Number (n): ";
cin>>num;
primeset[0]=2;
for(b=3;b<=1000;b++)
{

    for(c=2;c<b;c++)
    {
        d=b%c;
        if(d==0)
        {
            j=1;break;
        }
        else
        {
            j=0;
        }
    }

    if(j==0)
    {
        for(f=1;f<500;f++)
        {
            primeset[f]=b;
        }
    }
    else
    {
    //do nothing
    }
    }
    cout<<"n th Prime is "<<primeset[num-1];
    getch();
    return 0;
    }

这是我寻找第 n 个素数的程序,但它不起作用,请帮帮我。 请告诉我我的错误。 请告诉我,为什么我的程序不工作,它给 2 表示 num=1 和 997 表示 num 的所有其他值。告诉我错误和修复它们的代码。 PS:我用的是turbo c++

【问题讨论】:

  • 你不需要在嵌套循环中上升到 b - 你需要迭代到 b 的平方根。当您在h[f]=b 中引用f 时,f 将始终等于 2。另外,请为您的标识符提供合理的名称。 a,b,c,d,e,f,g,h,j 不自我描述。除了查看声明之外,没有办法知道 h 是一个数组。 f 是做什么的?
  • "f" 已用于描述数组 h 的第 f 个元素。我希望在 h[0] 中存储 2,在 h[1] 中存储 3,在 h[2] 中存储 5 等等......所以我设置了一个循环,其中 f,从 1、2、3 开始...... .. 请在我的程序中提出适当的修改建议,这与其他提供全新解决方案的人不同。
  • 我提出了解决小规模素数的正确方法——埃拉托色尼筛法。您可以通过对输出进行后处理来调整它以适应您的工作方式!如果您需要这方面的帮助,我可以提出建议。 :-)
  • 我已经更新了我的答案,从筛子转向动态规划。请看看这个!
  • 先生,感谢您的帮助,但是对于编程新手,我不知道 bool 和 index 等,请告诉我,为什么我的程序不工作,它给 2 表示 num=1 和997 对于所有其他 num 值

标签: c++ primes


【解决方案1】:

编辑:你不喜欢 Eratosthenes 的筛子,所以这里有另一种使用动态规划的方法。这意味着您使用已经创建的素数数组来决定下一个候选者是否是素数。

即,如果您生成了素数 [2,3,5,7],如果候选 8,9,10,11 可以被当前素数列表整除,那么您将计算第 4 个(从 0 开始的)素数.你从 8 开始一直上升,直到一个候选人不能被一个已经存在的素数整除

代码:

void createNextPrime(int* primes, int nextPrimeIndex) {
  int primeCandidate=primes[nextPrimeIndex-1];
  do {
    primeCandidate++;
    bool found=true;
    for(int primeIndex=0;primeIndex<nextPrimeIndex;primeIndex++) {
      if (primeCandidate%primes[primeIndex]==0) {
        found=false;
        break;
      }
    }
    if (found) {
      primes[nextPrimeIndex]=primeCandidate;
      return;
    }
  }
  while(true);
}

void createNPrimes(int primeCountToCreate) {
  int primes[primeCountToCreate];
  primes[0]=2;

  for(int primeIndexToCreate=1;primeIndexToCreate<primeCountToCreate;primeIndexToCreate++) {
    createNextPrime(primes,primeIndexToCreate);
  }

  for(int i=0;i<primeCountToCreate;i++) {
    cout<< primes[i]<< " ";
  }
  cout<<endl;
}

编辑:

这是你的代码,可以正常工作:

int main()
{
clrscr();
int num,c,d,f,primeset[500],composite=0;
cout<<"Enter Number (n): ";
cin>>num;
primeset[0]=2;
f=1;
for(int candidate=3;candidate<=1000;candidate++)
{
    composite=0;
    for(c=2;c*c<=candidate;c++)
    {
        d=candidate%c;
        if(d==0)
        {
            composite=1;
            break;
        }
    }

    if(composite==0)
    {
      primeset[f++]=candidate;
      // Not sure what this did
        /*for(f=1;f<500;f++)
        {
            primeset[f]=b;
        } */
    }
  }
  cout<<"n th Prime is "<<primeset[num-1]<<endl;
    getch();
  return 0;
}

【讨论】:

  • 如果这回答了您的问题,请打勾,以便其他人知道它已回答!
【解决方案2】:

您描述的问题称为素数分布问题,没有公式,所以我们只能靠蛮力。

这意味着找出哪个素数的唯一方法是遍历所有值,尽管我们可以跳过所有偶数值,因为 2 是唯一的偶数素数,我们对此有一个特殊情况。

#include <iostream>

bool isPrime(unsigned int number) 
{
    for (unsigned int i = 3; (i*i) <= number; i += 2) 
    {
        if (number % i == 0) 
            return false;
    }
    return true;
}

unsigned int nthPrime(unsigned int n)
{
    // Special case for checking for 1st prime which is 2.
    if (n == 1)
        return 2;

    unsigned int counter = 1;
    unsigned int number = 1;

    while (counter < n)
    {
        number += 2;
        counter += isPrime(number) ? 1 : 0;
    }
    return number;
}

int main(int argc, char** argv)
{
    unsigned int num;
    std::cout << "Nth Prime to calculate : ";
    std::cin >> num;
    std::cout << "Prime is " << nthPrime(num) << '\n';
    return 0;
}

根据您希望使用的素数的大小,您可能会使用 32 位无符号整数超出范围。用long long 替换unsigned int 会走得更远,但是,素数可以很快变得非常大,所以即使这样可能还不够。最终,您需要使用没有固定/有限长度的 n 位整数。加密密钥就是这种情况,它具有无法用 C++ 中的基本类型直接表示的巨大值。

n 位整数超出了此问题的范围,因此我将留给读者进行调查。

[编辑:] 请注意,您不能单独依赖 isPrime(...) 函数,因为没有检查奇数/偶数或前几个素数的特殊情况。它旨在与nthPrime(...) 函数结合使用。

【讨论】:

  • 先生,感谢您的帮助,但是对于编程来说,我不知道 bool 和 index 等,请告诉我,为什么我的程序不工作,它给 2 表示 num=1 和997 对于所有其他 num 值
【解决方案3】:

这是逻辑

号码:-输入号码 素数是 (2,3,5,7,11)

number=100;
nth= ? ;//enter the nth number prime u want
int a=2;
int count=0;
boolean status=true;
boolean success=false;
for(int i=a;i<=number;i++)
{
  for(int j=2;j<i;j++)
  {
     if(i/j == 0)
          status=false;
  }
  if(!status)
  {
   count++;
    if(count == nth){
        //print out nth prime number
          success=true;
         break;
    } 
  }
  if(!success){
   //nth prime is beyond the limit
  }
}

【讨论】:

  • 我不认为这是被问到的。这个例程给出给定值的所有素数,而不是第 n 个素数是什么?
  • 先生,感谢您的帮助,但是对于编程来说,我不知道 bool 和 index 等,请告诉我,为什么我的程序不工作,它给 2 表示 num=1 和997 对于所有其他 num 值
猜你喜欢
  • 2014-01-27
  • 2012-04-25
  • 2016-06-15
  • 1970-01-01
  • 2022-06-14
  • 2012-07-25
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多