题目链接:P1304 哥德巴赫猜想 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1304
思路:
只要先找出1~n以内的质数,在从4~n开始判断,最后输出就可以了。
for (int i = 4; i <= n; i += 2)
{
for (int j = 0; j < vc.size(); j++)
{
bool judge = true;
for (int k = 0; k < vc.size(); k++)
{
if (vc[j] + vc[k] == i)
{
cout << i << '=' << vc[j] << '+' << vc[k] << endl;
judge = false;
break;
}
}
if (!judge) break;
}
}
本题数据范围比较小,直接暴力搜索也是能过得。但也可以通过二分查询优化一下。
AC代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> vc;
//判断素数
bool prime(int x)
{
if (x < 2) return false;
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0) return false;
}
return true;
}
int main()
{
int n;
cin >> n;
//存1~n所有素数,方便后面查询
for (int i = 2; i <= n; i++)
if (prime(i)) vc.push_back(i);
//遍历所有偶数,从4开始
for (int i = 4; i <= n; i += 2)
{
for (int j = 0; j < vc.size(); j++)
{
int x = i - vc[j];//目标值
//二分查找
int l = 0, r = vc.size() - 1;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (vc[mid] <= x) l = mid;
else r = mid - 1;
}
//如果找到了 则输出,break
if (vc[l] == x)
{
cout << i << '=' << vc[j] << '+' << x << endl;
break;
}
}
}
return 0;
}