题目:
寻找素数对
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 1262
Description
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input
输入中是一些偶整数M(5<M<=10000).
Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
Sample Input
20 30 40
Sample Output
7 13
13 17
17 23
题目大意:
给一个数n,求和为n的最接近两个质数.
题目思路:
1、首先从最接近的算起 n/2和n/2 依次加1或者减1
2、判断两个是否是质数,是就找到了答案
题目优化:
1、因为询问的次数多,可以打个素数表,方便查询
2、因为右边的素数比左边的素数少,所以先判断右边的是不是减少判断的次数
程序:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cctype>
#include <fstream>
#include <limits>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cassert>
using namespace std;
#define maxn 10000
int n;
int is_prime[maxn+10];
int main()
{
memset(is_prime,0,sizeof(is_prime));
for(int i=2;i<maxn;i++)//素数表
if(!is_prime[i])
for(int j=2;j*i<=maxn;j++)
is_prime[i*j]=1;
while(~scanf("%d",&n))
{
for(int i=n/2;;i++)
if(!is_prime[i]&&!is_prime[n-i])//判断
{
printf("%d %d\n",n-i,i);
break;
}
}
return 0;
}