原题链接:PAT 1156 Sexy Primes(20分)
Sexy primes are pairs of primes of the form (p, p+6), so-named since “sex” is the Latin word for “six”. (Quoted from http://mathworld.wolfram.com/SexyPrimes.html)
Now given an integer, you are supposed to tell if it is a sexy prime.
Input Specification:
Each input file contains one test case. Each case gives a positive integer N (≤108 ).
Output Specification:
For each case, print in a line Yes
if N is a sexy prime, then print in the next line the other sexy prime paired with N (if the answer is not unique, output the smaller number). Or if N is not a sexy prime, print No
instead, then print in the next line the smallest sexy prime which is larger than N.
Sample Input 1:
47
Sample Output 1:
Yes
41
Sample Input 2:
21
Sample Output 2:
No
23
题目大意:
sexy primes的定义是这样的:两个数p和p+6,且他们均为质数,那么这两个数都属于sexy primes。
现在给你一个数,问你他是否属于sexy primes,如果是,返回和他配套的另一个数;如果不是,则返回在它之后的第一个满足sexy primes的数。
方法一:模拟
思路:
首先要会判断质数。
对于题目给出的数p:
- 如果满足p和p-6均是质数或者p和p+6均是质数,那么输出对应的另一个数即可
- 以上均不满足,那么从p+1开始进行判断,遇到第一个符合要求的数就break然后输出
C++ 代码:
// pat_a_1156#include <iostream>
#include <cmath>
using namespace std;// 筛法求素数
bool is_prime(int x){if(x < 2) return false;for(int i = 2; i <= sqrt(x); i++ )if(x % i == 0) return false;return true;
}int p, ans;int main(){cin >> p;// p和p-6 if(is_prime(p) && is_prime(p - 6)){cout << "Yes" << endl << p - 6; }// p和p+6 else if(is_prime(p) && is_prime(p + 6)){cout << "Yes" << endl << p + 6;}// 不满足 else{for(ans = p + 1; ; ans++ ){if(is_prime(ans) && is_prime(ans - 6)) break;if(is_prime(ans) && is_prime(ans + 6)) break;}cout << "No" << endl << ans;} return 0;
}