http://oj.ecustacm.cn/problem.php?id=1351
题意就是:每个偶数分解为两个素数,只取最小的那个,再在那些最小的数中找出最大的。
题目很绕。
#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
bool a[10005]={false};
int main(void)
{
int i,j;
for(int i=2;i<=10000;i++)
{
if(a[i]==false)
for(j=2;i*j<=10000;j++)
{
a[i*j]=true;
}
}
int k;
int max=-1;
int mi=999999;
for(i=10000;i>=4;i--)
{
for(j=i-1;j>=2;j--)
{
if(a[j]==false)
{
if(a[i-j]==false)
{
mi=min(j,i-j);//当前这个数所有的组合中最小的素数
}
}
}
if(mi>max)
{
max=mi;//每个数的最小数中最大的数
}
}
printf("%d\n",max);
return 0;
}
#include<cstdio>
#include<iostream>
using namespace std;
bool a[10005]={false};
int b[10005];
int ans=0;
int n=0;
void print()
{
for(int i=2;i<=10000;i++)
{
if(!a[i])
{
int j=2;
while(i*j<=10000) a[i*j]=true,j++;
}
}
for(int i=2;i<=10000;i++)
if(!a[i]) b[n++]=i;
}
int main(void)
{
print();
for(int i=2;i<=10000;i=i+2)
{
for(int j=0;j<n;j++)
{
bool flag=false;
for(int k=j+1;k<n;k++)
{
if(b[j]+b[k]==i)
{
ans=max(ans,b[j]);
flag=true;
}
}
if(flag)break;
}
}
cout<<ans<<endl;
return 0;
}