0
点赞
收藏
分享

微信扫一扫

poj 2262 Goldbach's Conjecture 素数打表

彩虹_bd07 2023-02-07 阅读 62


Goldbach's Conjecture

Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 48891

 

Accepted: 18614

Description

In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conjecture: 

Every even number greater than 4 can be 
written as the sum of two odd prime numbers.

For example: 

8 = 3 + 5. Both 3 and 5 are odd prime numbers. 
20 = 3 + 17 = 7 + 13. 
42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23.

Today it is still unproven whether the conjecture is right. (Oh wait, I have the proof of course, but it is too long to write it on the margin of this page.) 
Anyway, your task is now to verify Goldbach's conjecture for all even numbers less than a million. 

Input

The input will contain one or more test cases. 
Each test case consists of one even integer n with 6 <= n < 1000000. 
Input will be terminated by a value of 0 for n.

Output

For each test case, print one line of the form n = a + b, where a and b are odd primes. Numbers and operators should be separated by exactly one blank like in the sample output below. If there is more than one pair of odd primes adding up to n, choose the pair where the difference b - a is maximized. If there is no such pair, print a line saying "Goldbach's conjecture is wrong."

Sample Input

8

20

42

0

Sample Output

8 = 3 + 5

20 = 3 + 17

42 = 5 + 37

Source

​​Ulm Local 1998​​

算法分析:

题意:

给一个数n,满足n=a+b,a,b为质数且b-a最大

实现

直接素数打表就行,一开始的两重循环超时了,看了别人代码,傻了竟然,找到一个直接减不就行了。

代码实现:

#include<cstdio>  
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
using namespace std;
typedef long long ll;
int n,flag=0,k,sum=0,y;

const long N = 1000005;
long prime[N] = {0},num_prime = 0; //prime存放着小于N的素数
int isNotPrime[N] = {1, 1}; // isNotPrime[i]如果i不是素数,则为1
int Prime()
{
for(long i = 2 ; i < N ; i ++)
{
if(! isNotPrime[i])
prime[num_prime ++]=i;
//无论是否为素数都会下来
for(long j = 0 ; j < num_prime && i * prime[j] < N ; j ++)
{
isNotPrime[i * prime[j]] = 1;
if( !(i % prime[j] ) ) //遇到i最小的素数因子
//关键处1
break;
}
}
return 0;
}

int main()
{
int n;
Prime();
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
int maxx=-1,a,b,flag=0;

for(int i=0;i<num_prime;i++)
{
if(prime[i]>=n) break;
if(isNotPrime[n-prime[i]]!=1) //第一个找到的肯定b-a最大
{
a=prime[i];
b=n-a;
flag=1;
break;

}
}
if(flag==1)
{
printf("%d = ",n);
printf("%d + %d\n",a,b);
}
else
printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}

 

举报

相关推荐

0 条评论