打印n对素数,C ++

时间:2016-12-18 13:52:07

标签: c++

我需要编写一个打印n对素数的程序,这些对是:

p q

其中p和q是素数,q = p + 2。

输入示例:

n = 3

3 5 // 5 7 // 11 13 //

我几乎没有...所以,某人?

#include <iostream>
#include <cmath>

int twins(int n)
{
    for (int i = 0; i < n; i++)
    {
        ???
     }
}

int main()

{
    std::cout<<twins(5);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

这是这种野兽的顶级简单伪代码:

def printTwinPrimes(count):
    currNum = 3
    while count > 0:
        if isPrime(currNum) and isPrime(currNum + 2):
            print currnum, currnum + 2
            count = count - 1
        currNum = currNum + 2

它只是从3开始(因为我们知道2,4不可能作为双素数对,因为4是复合的)。对于每种可能性,它检查它是否构成双素数对并且如果是则打印它。

因此,除了将其转换为真正的代码之外,您需要做的就是创建isPrime(),网上有无数的例子。

为了完整性,这里是一个简单的,绝对不是最有效但适合初学者的:

def isPrime(num):
    if num < 2:
        return false
    root = 2
    while root * root <= num:
        if num % root == 0:
            return false
        root = root + 1
    return true

虽然你可以通过使用除了两个或三个之外的所有素数都是6n±1, n >= 1 (a)形式的事实来提高效率:< / p>

def isPrime(num):
    if num < 2: return false
    if num == 2 or num == 3: return true
    if num % 2 == 0 or num % 3 == 0: return false
    if num % 6 is neither 1 nor 5: return false

    root = 5
    adder = 2                   # initial adder 2, 5 -> 7
    while root * root <= num:
        if num % root == 0:
            return false
        root = root + adder     # checks 5, 7, 11, 13, 17, 19, ...
        adder = 6 - adder       # because alternate 2, 4 to give 6n±1
    return true

(a)如果你将任何非负数除以6而余数为0,2或4,那么它是偶数,因此是非素数(2是这里的例外情况):

6n + 0 = 2(3n + 0), an even number.
6n + 2 = 2(3n + 1), an even number.
6n + 4 = 2(3n + 2), an even number.

如果余数为3,那么它可以被3整除,因此非素数(3是这里的例外情况):

6n + 3 = 3(2n + 1), a multiple of three.

只剩下剩余的1和5,这些数字都是6n±1的形式。

答案 1 :(得分:0)

可能不是最有效但你可以计算所有素数直到n,将它们存储在一个向量中然后只打印那些相差2的

#include <iostream>
#include<vector>
using namespace std;

void pr(int n, vector<int>& v)
{
    for (int i=2; i<n; i++) 
    {
        bool prime=true;
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
            {
                prime=false;
                break;    
            }
        }   
        if(prime) v.push_back(i);
    }
}
int main()
{
   vector<int> v;
   pr(50, v);
   for(int i = 0;i < v.size()-1; i++) {
       if(v[i+1]-v[i] == 2) {
           cout << v[i+1] << " " << v[i] << endl;
       }
   }

   return 0;
}

答案 2 :(得分:-1)

我认为对你来说是有效的算法,而且易于理解。您可以根据约束更改k的值。

#include <iostream>
#include <cstring>
using namespace std;

int n,p=2,savePrime=2,k=100000;

void printNPrime(int n)
{
    bool prime[k];
    memset(prime, true, sizeof(prime));

   while(n>0)
   {
        if (prime[p] == true)
        {
            if(p-savePrime == 2)
            {
                cout<<savePrime<<" "<<p<<endl;
                n--;
            }
            // Update all multiples of p
            for (int i=p*2; i<=k; i += p)
                prime[i] = false;
            savePrime=p;    
        }
      p++;  
   }

}   

int main() {
    cin>>n;
    printNPrime(n);
    return 0;
}