我需要编写一个打印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;
}
答案 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;
}