[数学] 孪生素数

问题描述

如果 n n n n + 2 n+2 n+2 都是素数,称它们是孪生素数。

输入整数 m m m,输出两个均不超过 m m m 的最大孪生素数。

输入格式

输入一个整数 n n n

输出格式

两个空格间隔的整数,表示 m m m 以内最大的孪生素数,小的一个在前,大的一个在后。

样例

样例输入1:

20

样例输出1

17 19

样例输入2:

1000

样例输出2:

881 883

数据范围

5 ≤ n ≤ 10000 5 \le n \le 10000 5n10000

思路

这道题的思路很明确,从最大的一对开始判断。

  1. 如果都是素数,就输出这对素数,结束程序;
  2. 否则继续循环。

现在的问题就是怎么判断素数了。

我们可以定义一个变量 i i i,从 2 2 2 开始循环,一直循环到 s q r t ( n ) sqrt(n) sqrt(n)。每次判断 n n n 是否为 i i i 的倍数。

  1. 如果 n n n i i i 的倍数,跳过;
  2. 否则继续。

如果循环结束没有跳过,则 n n n 是素数,否则不是。

代码

判断素数代码:

bool check(int x){
    for(int i = 2; i * i <= x; ++ i){
        if(x % i == 0){//不是素数
            return 0;
        }
    }
    return 1;//不是素数
}

整个代码:

#include
using namespace std;
int n, m;
//判断素数
bool check(int x){
    for(int i = 2; i * i <= x; ++ i){
        if(x % i == 0){//不是素数
            return 0;
        }
    }
    return 1;//不是素数
}
int main(){
    scanf("%d", &m);//输入
    for(int i = m; i > 2; -- i){//从最大的开始循环,i 为其中最大的素数
        if(check(i) && check(i - 2)){//都为素数
            printf("%d %d", i - 2, i);
            return 0;
        }
    }
    return 0;
}

你可能感兴趣的:(算法,c++)