一【题目难度】
- 乙级
二【题目编号】
- 1099 性感素数 (20 分)
三【题目描述】
- “性感素数”是指形如 ( p , p + 6 ) (p, p+6) (p,p+6) 这样的一对素数。之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。(原文摘自 http://mathworld.wolfram.com/SexyPrimes.html)
- 现给定一个整数,请你判断其是否为一个性感素数。
四【题目示例】
-
输入格式:
输入在一行中给出一个正整数 N ( ≤ 1 0 8 ) N (≤10^8 ) N(≤108)。 -
输出格式:
若 N N N 是一个性感素数,则在一行中输出 Yes,并在第二行输出与 N N N 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。若 N N N 不是性感素数,则在一行中输出 No,然后在第二行输出大于 N N N 的最小性感素数。 -
输入样例 1:
47 -
输出样例 1:
Yes
41 -
输入样例 2:
21 -
输出样例 2:
No
23
五【解题思路】
- 这个题目只需要按照题目要求的一步一步分情况讨论即可,只是有些小点需要注意,具体步骤如下:
①:如果这个数是性感素数,按照题目要求从小到大输出
②:如果这个数不是性感素数,找到大于这个数的最小性感素数 - 这个题目又有两个坑点如下:
①:求某个数字是否为素数时,要开平方计算,这样节省时间,否则有两个用例会因为这个而超时
②:题目都说了是正整数,我在求某个数字是否为素数这个函数中判断这个数是否为1都不行,必须判断是否小于2才行,那这样的话说明这个数只能是0,而0不是正整数,所以对这里存疑,估计是测试用例有问题
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
bool isPrimeNumber(int x)
{
if(x < 2)
{
return false;
}
for(int i = 2;i<=sqrt(x);i++)
{
if(x % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
if(isPrimeNumber(n) && (isPrimeNumber(n-6) || isPrimeNumber(n+6)))
{
printf("Yes\n");
if(isPrimeNumber(n-6))
{
printf("%d",n-6);
}
else
{
printf("%d",n+6);
}
}
else
{
printf("No\n");
for(int i = n + 1;;i++)
{
if(isPrimeNumber(i) && (isPrimeNumber(i-6) || isPrimeNumber(i+6)))
{
printf("%d",i);
break;
}
}
}
return 0;
}