题目描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对
输入描述:
输入一个偶数
输出描述:
输出两个素数
输入例子:
20
输出例子:
7 13
这题比较基础,主要就是一个素数的判断,以及根据条件找最值问题。为了方便打印素数对,用vector<pair<int,int>>来存储所有满足条件的素数对(和为给定偶数),然后遍历查找差值最小的素数对。直接实现即可。
完整AC的代码:
#include <iostream>
#include <vector>
using namespace std;
bool isPrime(int n) //素数判断
{
if(n<2) //如果n小于2就不是素数,素数规定大于或等于2的整数
return false;
for(int i=2;i*i<=n;i++){
if(n % i == 0)
return false;
}
return true;
}
int main()
{
int num;
while(cin>>num){
vector<int > vec_primes;
for(int i=2;i<num;i++)
{
if(isPrime(i))vec_primes.push_back(i);
}
vector<pair<int,int>> prime_pairs;
for(int i=0;i<vec_primes.size();i++){
for(int j=0;j<vec_primes.size();j++){
if(vec_primes[i]+vec_primes[j]==num)
prime_pairs.push_back(make_pair(vec_primes[i],vec_primes[j]));
}
}
int min=9999;
pair<int,int> min_pair;
for(auto e:prime_pairs){
if(abs(e.first-e.second)<min){
min=abs(e.first-e.second);
min_pair.first=e.first;
min_pair.second=e.second;
}
}
cout<<min_pair.first<<endl<<min_pair.second<<endl;
}
return 0;
}
这题的素数对也可以用map<int,int>存储,只是查找最值,不需要指定顺序输出。