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
#include <iostream>
using namespace std;
typedef long long LL;
bool is_prime(LL n)
{
if(n < 2) return false;
for(LL i=2; i*i <= n; ++i)
if(n % i == 0)
return false;
return true;
}
int main()
{
LL n;
cin >> n;
LL res = 0;
if(is_prime(n-6) && is_prime(n))
res = n-6;
else if(is_prime(n) && is_prime(n+6))
res = n+6;
if(res == 0)
{
//注意此处要从 n-5开始枚举,不能从n+1开始枚举,因为可能
//有一对性感素数刚好是一个小于n,而另一个大于n,此时将大于n
//的值为输出结果;而m从n+1开始,就会错失这个最小的性感素数,
//导致答案出错
LL m = n-5;
while(is_prime(m) == false || is_prime(m+6) == false)
++m;
if(m < n)
res = m+6;
else res = m;
puts("No");
}
else
puts("Yes");
cout << res << endl;
return 0;
}