1099 性感素数
题目描述
“性感素数”是指形如 (p, p+6) 这样的一对素数。之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。
(原文摘自http://mathworld.wolfram.com/SexyPrimes.html)
现给定一个整数,请你判断其是否为一个性感素数。
输入格式:
输入在一行中给出一个正整数 N ( ≤ 1 0 8 ) N (≤10^8) N(≤108)。
输出格式:
若 N 是一个性感素数,则在一行中输出 Yes,并在第二行输出与 N 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。若 N 不是性感素数,则在一行中输出 No,然后在第二行输出大于 N 的最小性感素数。
输入样例1:
47
输出样例1:
Yes
41
输入样例2:
21
输出样例2:
No
23
方法
解题思路
如果 n 是素数, n - 6 或 n + 6 中有一个是素数,则 n 就是性感素数,并且 输出与之配对的性感素数(输出较小的那个)。
如果 n 不是素数,或者没有与之配对的性感素数,则 从 n + 1 开始逐个枚举,判断是否为性感素数。
试除法判定质数:时间复杂度为
O
(
n
)
O(\sqrt{n})
O(n)
bool isPrime(int n)
{
if(n < 2) return false;
for(int i = 2; i <= n / i; i++)
if(n % i == 0)
return false;
return true;
}
代码
#include <iostream>
using namespace std;
bool isPrime(int n)
{
if(n < 2) return false;
for(int i = 2; i <= n / i; i++)
if(n % i == 0)
return false;
return true;
}
int main()
{
int n;
cin >> n;
bool flag = false;
if(isPrime(n))
{
if(isPrime(n - 6))
{
flag = true;
cout << "Yes" << endl << n - 6;
}
else if(isPrime(n + 6))
{
flag = true;
cout << "Yes" << endl << n + 6;
}
else
cout << "No" << endl;
}
else
cout << "No" << endl;
n++;
while(!flag)
{
if(isPrime(n) && (isPrime(n + 6) || isPrime(n - 6)))
{
cout << n;
flag = true;
}
n++;
}
return 0;
}
复杂度分析
- 时间复杂度: O ( n ) O(\sqrt{n}) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。