簡體   English   中英

生成第n個素數的程序

[英]Program to generate nth prime number

#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個素數的程序,但它不起作用,請幫幫我。 請告訴我我的錯誤。 請告訴我,為什么我的程序不起作用,它為 num=1 提供 2,為 num 的所有其他值提供 997。 告訴我錯誤和修復它們的代碼。 PS:我使用渦輪增壓 C++

編輯:你不喜歡 Eratosthenes 的篩子,所以這里是另一種使用動態規划的方法。 這意味着您使用已經創建的素數數組來決定下一個候選者是否是素數。

即,如果您生成了素數 [2,3,5,7],要確定第 4 個(基於 0 的)素數是您計算候選 8,9,10,11 是否可被當前素數列表整除。 你不斷從 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;
}

這是邏輯

number:-Enter Number 質數是 (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
  }
}

您描述的問題稱為素數分布問題,並且沒有公式,因此我們只能使用蠻力。

這意味着找出哪個素數的唯一方法是遍歷所有值,盡管我們可以跳過所有偶數值,因為 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 位 unsigned int 的范圍。 long long代替unsigned int會更進一步,但是,質數會很快變得很大,所以即使這樣也可能不夠。 最終,您需要使用沒有固定/有限長度的 n 位整數。 這就是加密密鑰的情況,它具有無法用 C++ 中的基本類型直接表示的巨大值。

n 位整數不在此問題的范圍內,因此我將留給讀者對此進行調查。

[編輯:] 請注意,您不能isPrime(...)依賴isPrime(...)函數,因為沒有檢查奇數/偶數或前一對素數的特殊情況。 它旨在與nthPrime(...)函數結合使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM