POJ 2262 Goldbach's Conjecture 哥德巴赫猜想

题目:

       1742年,哥德巴赫提出一个猜想:任何大于4的偶数都可以表示为两个奇素数之和。例如:8=3+5,其中3和5都是奇素数, 20=3+17=7+13。42=5+37=11+31=13+29=19+23.

现在的任务是在1,000,000以内验证哥德巴赫猜想。

输入:

        输入包含一个或多个数字n,n均为偶数且6<=n<1000000。输入以0结束。

输出:

        对于每个数字,打印出一行n = a + b,其中a和b都是奇素数,数字和操作符之间恰好隔一个空格。如果a和b有多对,则输出b-a最大的那对。如果找不到这样的a、b对,则输出 "Goldbach's conjecture is wrong."

样例输入:

8

20

42

0

样例输出:

8 = 3 + 5

20 = 3 + 17

42 = 5 + 37

解题思路:

最小的奇素数是3,令a=3,求出b=n-a,

   如果b也为奇素数,则猜想成立,输出结果

   如果b不为奇素数,则令a为紧跟着a的下一个奇素数,重复计算b=n-a,直到b为奇素数或者a已经大于n的一半为止。(当a大于n的一半时,说明n不能表示为两个奇素数之和,猜想不成立)


代码:

#include<stdio.h>

//判断一个数是否是奇素数 
int isOddPrime(int num)
{
	int i;
	if(num%2==0) return 0;
	for(i=2; i*i<=num; i++)
	  if(num%i==0) return 0;
	return 1;
}

//获得指定奇素数的下一个奇素数 
int getNextOddPrime(int num)
{
	num++;
	while(!isOddPrime(num)) num++;
	return num;
}

int main()
{
	int n,a,b;
	scanf("%d", &n);
	while(n != 0)
	{
		a=3;
		b=n-a;
		while(!isOddPrime(b))
		{
			a = getNextOddPrime(a);
			b=n-a;
			if(a > n/2) break;
		}
		if(a > n/2) printf("Goldbach's conjecture is wrong.\n");
		else printf("%d = %d + %d\n", n, a, b);
		
		scanf("%d", &n);
	}
	return 0;
}




阅读更多
文章标签: 任务
个人分类: POJ
上一篇POJ 1083 Moving Tables
下一篇POJ 1503 Integer Inquiry
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭