链接:
E-哥德巴赫猜想_河南萌新联赛2024第(五)场:信息工程大学 (nowcoder.com)
题目描述
1742 年 6 月 7 日,哥德巴赫写信给当时的大数学家欧拉,提出了以下的猜想:任何一个大于 9 的奇数都可以表示成 3 个质数之和。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
现在请你编一个程序验证哥德巴赫猜想。
输入描述:
输出描述:
思路:
利用素数筛将50000以内的素数全都筛出来,然后再枚举三重循环就行,50000以内的素数有5000个,因为循环会加很多限制条件,所以不会超时
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=50000;
bool vis[N];
int prime[5800];
int cnt;
void solve()
{
int n;
cin>>n;
for(int i=1;i<=cnt && prime[i]<=n;i++)
{
for(int j=i;j<=cnt && prime[i]+prime[j]<=n ;j++)
{
for(int k=j; prime[i]+prime[j]+prime[k]<=n && k<=cnt ;k++)
{
if(prime[i]+prime[j]+prime[k]==n)
{
cout<<prime[i]<<" "<<prime[j]<<" "<<prime[k]<<endl;
return;
}
}
}
}
puts("-1");
}
int euler_sieve(int n)
{
int cnt=0;
for(int i=2;i<=n;i++)
{
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt;j++)
{
if(i*prime[j]>n) break;
vis[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cnt=euler_sieve(50000);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}