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
算法分析:
题意:
给一个数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;
}
标签:prime,Conjecture,int,Goldbach,conjecture,long,打表,include From: https://blog.51cto.com/u_14932227/6041968