<---
大佬们点个赞吧qwq
→→→暑假每日一题2022题解合集←←←
“性感素数 ”是指形如 (p,p+6) 这样的一对素数。
之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。
现给定一个整数,请你判断其是否为一个性感素数。
输入格式
输入在一行中给出一个正整数 N。
输出格式
若 N 是一个性感素数,则在一行中输出Yes
,并在第二行输出与 N 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。
若 N 不是性感素数,则在一行中输出No
,然后在第二行输出大于 N 的最小性感素数。
数据范围
1≤N≤108
思路
看一下题目标签,这道题考的是枚举
那枚举思路就很清晰了:
1. 先判断 N 是不是性感素数
2. 如果不是,则往后枚举,依次判断是否是性感素数
坑点
为了方便,我们在下文中把“大于 N 的最小性感素数”称为 M。
这题的话坑点主要在这句话:
若 N 不是性感素数,则在一行中输出
No
,然后在第二行输出大于 N 的最小性感素数。
有些傻孩子脑子抽筋了,在 N 不是性感素数的情况下输出了与 M 配对的性感素数(诶没错,这个傻孩子就是我,你看我都替你踩坑了,还不点个赞)
还有一个点就是有些人自作聪明觉得 M 配对的一定是 M+6,要不然 M−6 才是大于 N 的最小性感素数,就矛盾了(诶又是我)
这些人忽略了一个条件, M 不一定 ≥N+6,假如 M 配对的就是 M−6,那 M−6就不一定大于 N 了。
C++代码(带注释)
#include <iostream>
using namespace std;
bool is_prime(int x) // 判定质数(这个只需要参照算法基础课里的模板就行了)
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
return false;
return true;
}
int main()
{
int n;
cin >> n;
if (is_prime(n) && is_prime(n - 6)) // (n, n - 6) 是一对性感素数
{
puts("Yes");
cout << n - 6;
}
else if (is_prime(n) && is_prime(n + 6)) // (n, n + 6) 是一对性感素数
{
puts("Yes");
cout << n + 6;
}
else
for (;;) // 往后枚举每一个数
if (is_prime( ++ n) && (is_prime(n - 6) || is_prime(n + 6))) // (n, n - 6) 或 (n, n + 6) 是一对性感素数
{
puts("No");
cout << n;
break;
}
return 0;
}
python代码(带注释)
n = int(input())
def is_prime(x): # 判断素数模板
if x < 2: return 0
for i in range(2, int(x ** 0.5 + 1)):
if x % i == 0:
return 0
return 1
if is_prime(n) and is_prime(n - 6): # (n, n - 6) 是一对性感素数
print(f'Yes\n{n - 6}')
elif is_prime(n) and is_prime(n + 6): # (n, n + 6) 是一对性感素数
print(f'Yes\n{n + 6}')
else:
while 1:
n += 1 # 往后枚举每一个数
if is_prime(n) and (is_prime(n - 6) or is_prime(n + 6)): # (n, n - 6) 或 (n, n + 6) 是一对性感素数
print(f'No\n{n}')
break # 退出循环