一、题目链接
http://noi.openjudge.cn/ch0112/10/
二、解题思路(Java)
三、解题思路(C++)
四、Java程序
import java.util.Scanner;
public class Main {
/**
* 判断指定正整数是否为素数
*
* @param n int类型的正整数,代表指定正整数
* @return 逻辑值,true当且仅当n是素数,否则false
*/
public boolean isPrime(int n) {
if (n == 2) { // 2肯定是素数
return true;
}
else if (n < 2 || n % 2 == 0) { // 小于2或者非2的偶数肯定不是素数
return false;
}
else { // 以下仅需要考虑大于等于3的奇数
/* 在[3,sqrt(n)]范围内检测是否有n的奇数真因子 */
for (int i = 3; i * i <= n; i = i + 2) {
if (n % i == 0) { // 如果n有奇数真因子
return false; // 则n不是素数
}
}
return true; // 以上没有返回false,说明n是素数
}
}
/**
* 输出指定范围内所有的素数对
*
* @param n int类型的正整数,代表指定范围的上界
*/
public void printTwinPrimes(int n) {
if (n < 5) { // 上界n小于5,则肯定没有素数对
System.out.print("empty");
}
else { // 否则,上界n大于等于5
/* 检测[3,n]范围内所有可能的素数对 */
for (int i = 3; i + 2 <= n; i = i + 2) {
// 如果i和i+2均为素数,则构成一个素数对
if (isPrime(i) && isPrime(i + 2)) {
System.out.println(i + " " + (i + 2));
}
}
}
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int n = input.nextInt();
test.printTwinPrimes(n);
}
}
五、C++程序
#include<iostream>
using namespace std;
bool isPrime(int n) // 自定义函数,判断指定正整数是否为素数
{
if (n == 2) // 2肯定是素数
{
return true;
}
else if (n < 2 || n % 2 == 0) // 小于2或者非2的偶数肯定不是素数
{
return false;
}
else // 以下仅需要考虑大于等于3的奇数
{
/* 在[3,sqrt(n)]范围内检测是否有n的奇数真因子 */
for (int i = 3; i * i <= n; i = i + 2)
{
if (n % i == 0) // 如果n有奇数真因子
{
return false; // 则n不是素数
}
}
return true; // 以上没有返回false,说明n是素数
}
}
void printTwinPrimes(int n) // 自定义函数,输出指定范围内所有的素数对
{
if (n < 5) // 上界n小于5,则肯定没有素数对
{
cout << "empty";
}
else // 否则,上界n大于等于5
{
/* 检测[3,n]范围内所有可能的素数对 */
for (int i = 3; i + 2 <= n; i = i + 2)
{
if (isPrime(i) && isPrime(i + 2)) // 如果i和i+2均为素数,则构成素数对
{
cout << i << " " << i + 2 << endl;
}
}
}
}
int main()
{
int n;
cin >> n;
printTwinPrimes(n); // 调用printTwinPrimes函数
return 0;
}