1.来源
https://www.nowcoder.com/questionTerminal/f8538f9ae3f1484fb137789dec6eedb9?toCommentId=289324
2.题目
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。本题含有多组样例输入。
输入描述:
输入一个偶数
输出描述:
输出两个素数
示例1
输入
20
输出
7
13
3.代码
方法1:
#include<iostream>
#include<cmath>
using namespace std;
//思路:偶数num由两个素数组成,那么这两个素数一定是一个比num的一半小的,一个比num的一半大的数
//从num/2开始向两边找到最近的两个素数,就是符合题目要求的
bool isPrime(int n)
{
int i=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)//如果能被除了1和它本身的数整除,就不是素数
return false;
}
return true;
}
int main()
{
int num=0;
while(cin>>num)
{
int mid_num=num/2;
int a=mid_num;//左值
int b=0;//右值
while(a)
{
b=num-a;
if(!isPrime(a)||!isPrime(b))
break;
a--;//a发生变化,b也一定会发生变化
}
}
return 0;
}
方法2:
#include<iostream>
#include<cmath>
using namespace std;
//思路:偶数num由两个素数组成,那么这两个素数一定是一个比num的一半小的,一个比num的一半大的数
//从num/2开始向两边找到最近的两个素数,就是符合题目要求的
bool isPrime(int n)
{
int i=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)//如果能被除了1和它本身的数整除,就不是素数
return false;
}
return true;
}
int main()
{
int num=0;
while(cin>>num)
{
int mid_num=num/2;
//不能按下面这样写,因为不符合全部情况,6-> 3 3-3=0
//int left=mid_num-1,right=mid_num+1;
int left=mid_num,right=num-left;
while(!isPrime(left)||!isPrime(right))
{
left--;
right++;
}
cout<<left<<endl;
cout<<right<<endl;
}
return 0;
}