功能:查找组成一个偶数最接近的两个素数
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
//实例:20 输出:7 13
思路:先找出满足条件自身和sum-自身都是素数的数,之后再运用循环来找出距离最近的两个素数
参考代码:
//功能:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
//实例:20 输出:7 13
#include <iostream>
using namespace std;
//判断一个数是否为素数
bool JudgIsPrime(const int a)
{
for(int i = 2;i <= a/2; i++)
{
if(a % i == 0)
return 0;
}
return 1;
}
int main()
{
int b;
cin >> b;
//非偶数异常输入
while(b % 2 != 0)
return 0;
int j,distance,t = 0;
int min = 0;
for(j = 2; j <= b/2; j++)
{
if (JudgIsPrime(j) && JudgIsPrime(b - j))
{
distance = b - j -j;
if (min==0 || min > distance)
{
min = distance;
t = j;
}
}
}
cout << t << endl;
cout << (b - t) << endl;
}
算法巧妙之处:
1)判断是否为素数时,只需要设置初始为2,最大值为a/2,而不是a,这样大大提高运算效率。
bool JudgIsPrime(const int a)
{
for(int i = 2;i <= a/2; i++)
{
if(a % i == 0)
return 0;
}
return 1;
}
2)找出距离最短的distance,很巧妙设置初始距离min = 0;之后利用一个if(min == 0 || min > distance)逻辑运算条件来覆盖min,同时更新min,并且利用新的参数t保存j.(这点非常重要)
这里还需要强调一点这个if不能用while,否则就死循环了,要区分if和while的区别。
if (JudgIsPrime(j) && JudgIsPrime(b - j))
{
distance = b - j -j;
if (min==0 || min > distance)
{
min = distance;
t = j;
}
}
——To_捭阖_youth 0:02