POJ 2262 Goldbach's Conjecture

简介: Problem Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the foll...

Problem 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

用打表法

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int sum(int x){
    int i;
     int t = sqrt ( x + 0.5 ) ;
    for(i=2;i<=t;i++){
        if(x%i==0)
            return 0;
    }
    return 1;
}
int arr[500005],j=0;
void a(){
       int i;
    for(i=3;i<500000;i++){
        if(sum(i))
            arr[j++]=i;
    }
}
int main(){

    int m,i;
    a();
    /**for(i=0;i<10;i++)
    {
        printf("%6d",arr[i]);
    }**/
    while(1){
        int m;
        scanf("%d",&m);
    if(m==0){
        return 0;
    }
    if(m==6){
        printf("6 = 3 + 3\n");
    }
    else{
        int flag=0;
        for(i=0;i<m/2&&m/2>arr[i];i++)
        if(sum(m-arr[i])==1){
                flag=1;
                //printf("i=%d\n",i);
            break;
        }
       if(flag){
            //printf("##i=%d\n",i);
           printf("%d = %d + %d\n",m,arr[i],m-arr[i]);
       }
       else
          printf("Goldbach's conjecture is wrong.\n");
    }
    }
    return 0;
}
目录
相关文章
|
6月前
|
算法 数据建模
Poj 3169(差分约束系统)
Poj 3169(差分约束系统)
34 0
poj 3298 数状数组
题目大意是一条大街上住着n个乒乓球爱好者,他们的水平高低用一个数值表示,他们经常举办比赛,比赛要三个人,一人当裁判。对裁判是有一定要求的,裁判的水平必须介于两选手之间且必须住他们中间,计算可以举办多少场比赛
41 0
|
C语言
poj 2503 查字典
Description You have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language.
866 0
poj 3664
http://poj.org/problem?id=3664 进行两轮选举,第一轮选前n进入第二轮,第二轮选最高   #include #include using namespace std; struct vote { int a,b; int c; ...
735 0
|
人工智能 BI
POJ 2487 Stamps
Description Background Everybody hates Raymond. He’s the largest stamp collector on planet earth and because of that he always makes fun of all the others at the stamp collector parties.
1063 0
|
机器学习/深度学习
poj 1456 Supermarket
点击打开链接poj 1456 思路: 贪心+并查集 分析: 1 题目的意思是给定n个物品的利润和出售的最后时间,求最大的利润 2 比较明显的贪心问题,按照利润排序,假设当前是第i个物品,那么利润为pi出售的时间为di,那么假设di还没有物品销售那么肯定先销售第i个物品,否则找di~1这些时间里面是否有没有销售物品 3 如果按照2的思路做法最坏的情况是O(n^2),但是数据比较弱可以过。
811 0