poj 2262 Goldbach's Conjecture 【素数筛】

简介:

这题必然的筛选法,出现了2个问题:1.开始开了一个 result 数组(全局变量),想把素数挨个存进来,虽然还计数估算了的,一直的runtime error , 后来发现是多此一举,去掉之后就变成wrong answer,看来可以编译了。这么说来,一百万对于两个大数组还是有点吃不消的  2.筛的时候一定要筛完整,for(j=2*i;j<MAXN;j+=i)prime[j]=1;这里开始用的

j<(MAXN/i),明显就错了

另外我很好奇题目中说的"Goldbach's conjecture is wrong.",很明显不会wrong的,wrong了科学家们还继续证明干嘛,可是我AC以后看网上的结题报告居然还真有把wrong考虑进去的人。。。


2个错误都存在的代码


#include <stdio.h>

#define MAXN 1000002
#define PrimeNum 671000

int prime[MAXN];		//用筛法求素数,1代表不是素数(被筛掉)
int result[PrimeNum];

int main()
{
	//先打出素数表
	prime[0]=prime[1]=1;    //开始去掉prime[0]和prime[1]
	int i,j;
	for(i=2;i<MAXN;i++)
	{
		if(prime[i]==0)		//如果prime[i]是素数就把他的倍数都筛掉
		{
			for(j=2*i;j<(MAXN/i);j+=i)
				prime[j]=1;
		}
	}

	//test 1
	/*int count=0;
	for(i=2;i<MAXN;i++)
		if(prime[i]==0)
			count++;
	printf("一百万以内的素数有 %d 个\n",count);*/

	//test 2
	/*for(i=2;i<100;i++)
		if(prime[i]==0)
			printf("%d ",i);*/

	int count=0;
	for(i=3;i<100;i++)
		if(prime[i]==0)
		{
			result[count]=i;
			count++;
		}

	/*for(i=0;i<100;i++)
		printf("%d ",result[i]);*/


	int n;
	while(scanf("%d",&n))
	{
		if(n==0)
			break;

		for(i=0; ;i++)
			if(prime[n-result[i]]==0)
			{
				printf("%d = %d + %d\n",n,result[i],n-result[i]);
				break;
			}
	}

	return 0;
}



正确的代码


#include <stdio.h>

#define MAXN 1000002

int prime[MAXN];		//用筛法求素数,1代表不是素数(被筛掉)

int main()
{
	//先打出素数表
	prime[0]=prime[1]=1;    //开始去掉prime[0]和prime[1]
	int i,j;
	for(i=2;i<MAXN;i++)
	{
		if(prime[i]==0)		//如果prime[i]是素数就把他的倍数都筛掉
		{
			for(j=2*i;j<MAXN;j+=i)
				prime[j]=1;
		}
	}


	int n;
	while(scanf("%d",&n))
	{
		if(n==0)
			break;

		for(i=3; ;i++)
			if(prime[i]==0 && prime[n-i]==0)
			{
				printf("%d = %d + %d\n",n,i,n-i);
				break;
			}
	}

	return 0;
}


相关文章
|
6月前
poj 1990 MooFest 树状数组
题意就是有N头牛,每头牛都有一个坐标和声调值(x, v),两头牛之间通讯要花费的能量是他们的距离乘以最大的一个音调值,现在要任意两头牛之间都相互通讯一次,求总共需要花费多少能量?
20 0
POJ-3641,Pseudoprime numbers(快速幂)
POJ-3641,Pseudoprime numbers(快速幂)
|
人机交互
POJ-2524,Ubiquitous Religions(并查集模板题)
POJ-2524,Ubiquitous Religions(并查集模板题)
|
人工智能 网络架构
poj2793 素数和
题目链接:http://poj.org/problem?id=2739   #include using namespace std; int count=0; int prim[1234]={2,3}; void primer() { ...
712 0
poj-2909-哥德巴赫猜想
Description For any even number n greater than or equal to 4, there exists at least one pair of prime numbers p1 and p2 such that n = p1 + p2 This conjecture has not been proved nor refused yet.
770 0
|
容器
hdu3388 Coprime【容斥原理】
Problem Description Please write a program to calculate the k-th positive integer that is coprime with m and n simultaneously.
1104 0
poj1287 kruskal
http://poj.org/problem?id=1287 #include&lt;cstdio&gt; #include&lt;cstdlib&gt; #include&lt;iostream&gt; #define N 60 using namespace std; struct node { int x,y; int len; } city[26
857 0
|
人工智能
poj1861 kruskal
http://poj.org/problem?id=1861 #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&lt;cstdlib&gt; using namespace std; #define maxn 1001 #define maxm 15001 struct edge { int u,v
1258 0