题解 | #查找组成一个偶数最接近的两个素数# 先筛素数,再从中间向两边查找
查找组成一个偶数最接近的两个素数
http://www.nowcoder.com/practice/f8538f9ae3f1484fb137789dec6eedb9
优化1
我们可以预处理出来一个小于n的素数数组,而不必每次去判断是否为素数。
优化2
从素数数组中间向两边查找,时间一定是最短的
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1010;
bool st[N];
inline void solve(int &n)
{
vector<int> pr;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
pr.push_back(i);
for (int j = i; j <= n; j += i)
st[j] = true;
}
}
//for (int i = 0; i < pr.size(); i++) cout << i << '-' << pr[i] << '|';
//cout << endl;
int mid = n >> 1;
int k = -1;
for (int i = 0; k == -1 && i < pr.size() - 1; i++) { // find middle index
if (pr[i] <= mid && pr[i + 1] > mid) k = i;
}
//cout << k << endl << pr[k];
//return;
int i = k, j = k;
for (; i >= 2 && j < n;) {
if (pr[i] + pr[j] == n) break;
else if (pr[i] + pr[j] < n) j++;
else i--;
}
cout << pr[i] << endl << pr[j] << endl;
}
int main()
{
int n;
for (; cin >> n; memset(st, false, sizeof(st)))
solve(n);
return 0;
}
海康威视公司福利 1330人发布