“性感素数”是指形如 (p, p+6) 这样的一对素数。之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。(原文摘自 http://mathworld.wolfram.com/SexyPrimes.html)
现给定一个整数,请你判断其是否为一个性感素数。
输入格式:
输入在一行中给出一个正整数 N (≤)。
输出格式:
若 N 是一个性感素数,则在一行中输出 Yes
,并在第二行输出与 N 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。若 N 不是性感素数,则在一行中输出 No
,然后在第二行输出大于 N 的最小性感素数。
问题分析:
这道题不难,但是笔者测试点2一直过不了。后来发现代码里面没有判断数字小于等于7的情况。加上如下判断代码后即可实现。
if (n < 7)
{
if (n == 5)
{
cout << "Yes\n";
cout << 11;
}
else
{
cout << "No\n";
if (n < 5)
cout << 5;
else
cout << 7;
}
return 0;
}
else if (n == 7)
{
cout << "Yes\n";
cout << 13;
return 0;
}
应该可以设置更简单,有兴趣的读者可以试一下。附上完整代码。
#include<iostream>
#include<cmath>
using namespace std;
int main() {
long int n;
cin >> n;
long int min = n - 6;
long int max = n + 6;
bool issu = true;
bool xin_su = false;
bool xiao = true;//较小或较大
if (n < 7)
{
if (n == 5)
{
cout << "Yes\n";
cout << 11;
}
else
{
cout << "No\n";
if (n < 5)
cout << 5;
else
cout << 7;
}
return 0;
}
else if (n == 7)
{
cout << "Yes\n";
cout << 13;
return 0;
}
for(int i =2;i<sqrt(n);i++)
if (n % i == 0)
{
issu = false;
break;
}
if (issu)//是质数
{
xin_su = true;
for(int i =3;i<sqrt(min);i+=2)
if (min % i == 0)
{
xin_su = false;
break;
}
if (!xin_su)
{
xiao = false;
xin_su = true;
for (int i = 3; i < sqrt(max); i+=2)
if (max % i == 0)
{
xin_su = false;
break;
}
}
}
if (xin_su)
{
cout << "Yes\n";
if (xiao)
cout << min;
else
cout << max;
return 0;
}
cout << "No\n";
if (n % 2 == 0)//转为奇数
n++;
issu = true;
while (1)
{
for (int i = 3; i < sqrt(n); i+=2)//是否为素数
if (n % i == 0)
{
issu = false;
break;
}
if (issu)//是质数
{
xin_su = true;
for (int i = 3; i < sqrt(n-6); i += 2)
if ((n-6)% i == 0)
{
xin_su = false;
break;
}
if (!xin_su)
{
xin_su = true;
for (int i = 3; i < sqrt(n+6); i += 2)
if ((n+6) % i == 0)
{
xin_su = false;
break;
}
}
}
if (xin_su)
break;
else
{
issu = true;
n+= 2;
}
}
cout << n;
return 0;
}