您的位置:首页 > 其它

Hdu-1262寻找素数对

2017-05-24 22:03 323 查看
寻找素数对

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13710    Accepted Submission(s): 6914


Problem Description

哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.


Input

输入中是一些偶整数M(5<M<=10000).


Output

对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.


Sample Input

20 30 40


Sample Output

7 13
13 17
17 23


/*
何为素数筛选法:就是把已知素数的倍数标记为合数。开始最小的素数为2.
*/
#include<iostream>
#include<cmath>
#include<vector>
#include<cstdio>
using namespace std;
const int maxn = 10005;
vector<int> in;
int prime[maxn]={0};
void prime_num()
{
prime[0]=prime[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!prime[i])
{
for(int j=i*2;j<=maxn;j+=i)
prime[j]=1;
}
}
}
void inp()
{
in.clear();
int x;
char ch;
do
{
scanf("%d%c",&x,&ch);
in.push_back(x);
}while(ch!=10);
}
void solve()
{
for(int i=0;i<in.size();i++)
{
int t=in[i]>>1;
int l=t,r=t;
while(l>=2&&r<in[i])
{
if(prime[l]||prime[r])
{
if(prime[l]) l--;
if(prime[r]) r++;
continue;
}

if(l+r==in[i])
{
cout<<l<<" "<<r<<endl;
break;
}
if(l+r>in[i])
{
l--;
continue;
}
if(l+r<in[i])
{
r++;
continue;
}
}
}
}
int main()
{
prime_num();
inp();
solve();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  基础算法