poj 2739 Sum of Consecutive Prime Numbers【素数筛】

我觉得这题的数据应该有些刁钻,一共至少提交了五次,一直是WA,无语了。。。。。。用一个result数组存素数硬是不对。后来就算了,改用直接判断(法二),继续WA,后来发现是MAXN至少应为10002(被数据坑了),终于A掉了。。。。。。

后来继续改法一多次,任然WA,一直不清楚原因。

继续思考发现有一个很隐蔽的问题就是我后来用到   if(result[i]>n)
break;    而result数组中 10000以内 最后一个素数是 9997,后面全是0了。这样无法停止,所以必须加一个大数作为哨兵。后来一试,果然AC了!

法二:(AC的代码)

#include <stdio.h>

#define MAXN 10002

int prime[MAXN];		//用筛法求素数,0代表素数

int main()
{
	//先打出素数表
	prime[0]=prime[1]=1;    //开始去掉[0]和[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,sum,count;
	while(scanf("%d",&n))
	{
		if(n==0)
			break;

		count=0;		//count做最后输出的 所有表示个数
		for(i=0; ;i++)				// i 控制素数串第一个数
		{
			if(prime[i]!=0)
				continue;
			if(i>n)
				break;

			sum=0;					//sum存 连续素数和
			for(j=i; ;j++)
			{
				if(prime[j]!=0)
					continue;
				if(sum>n)
					break;

				sum=sum+j;
				if(sum==n)
				{
					count++;
					break;
				}
			}
		}

		printf("%d\n",count);
	}

	return 0;
}

法一(错误代码)

#include <stdio.h>

#define MAXN 10002

int prime[MAXN];		//用筛法求素数,0代表素数
int result[1300];

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 count=0;
	for(i=2;i<MAXN;i++)
		if(prime[i]==0)
		{
			result[count]=i;
			count++;
		}

	//test:估算素数个数
	/*for(i=0;result[i]!=0;i++)
	{
		printf("%d ",result[i]);
	}
	printf("\n1W以内有 %d 个是素数\n",count);*/

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

		count=0;		//count做最后输出的 所有表示个数
		for(i=0; ;i++)
		{
			if(result[i]>n)
				break;

			sum=0;					//sum存 连续素数和
			for(j=i; ;j++)
			{
				if(sum>n)
					break;

				sum=sum+result[j];
				if(sum==n)
				{
					count++;
					break;
				}
			}
		}

		printf("%d\n",count);
	}

	return 0;
}

法一(AC的代码)

#include <stdio.h>

#define MAXN 10002

int prime[MAXN];		//用筛法求素数,0代表素数
int result[1300];

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 count=0;
	for(i=2;i<MAXN;i++)
		if(prime[i]==0)
		{
			result[count]=i;
			count++;
		}

	result[count]=99999;		//哨兵,因为result最后一个是9997,后面没有了

	//test:估算素数个数
	/*for(i=0;result[i]!=0;i++)
	{
		printf("%d ",result[i]);
	}
	printf("\n1W以内有 %d 个是素数\n",count);*/

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

		count=0;		//count做最后输出的 所有表示个数
		for(i=0; ;i++)
		{
			if(result[i]>n)
				break;

			sum=0;					//sum存 连续素数和
			for(j=i; ;j++)
			{
				if(sum>n)
					break;

				sum=sum+result[j];
				if(sum==n)
				{
					count++;
					break;
				}
			}
		}

		printf("%d\n",count);
	}

	return 0;
}
时间: 2024-12-27 23:15:24

poj 2739 Sum of Consecutive Prime Numbers【素数筛】的相关文章

HDOJ(HDU) 2138 How many prime numbers(素数-快速筛选没用上、)

Problem Description Give you a lot of positive integers, just to find out how many prime numbers there are. Input There are a lot of cases. In each case, there is an integer N representing the number of integers to find. Each integer won't exceed 32-

poj 2262 Goldbach&amp;#39;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 conjec

poj 3006 Dirichlet&amp;#39;s Theorem on Arithmetic Progressions 【素数筛】

说实话,题目很长,但是和真正要思考的东西关系不大... 就用了之前的素数筛的模板,控制了一下输入.输出格式就过了,很水的题,没什么技术含量,我好像也只会用暴搜... #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&l

[LeetCode]129.Sum Root to Leaf Numbers

[题目] Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 /

【LeetCode从零单排】No129 Sum Root to Leaf Numbers

题目 Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / \

Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / \ 2 3

LightOJ 1370 Bi-shoe and Phi-shoe(素数筛)

Click Here~~ A - Bi-shoe and Phi-shoe Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1370 Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular

POJ 2739 素数打表

题意:给你一个数问你用连续的素数来表示这个数有几种表示方法. 先打一个素数表,再把素数表变下形,prime[i]存prime[i]之前的素数和,循环一下打出ans表即可. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 10050 int prime[maxn],nprime,ans[max

UVa 640 Self Numbers:类似素数筛

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=581 关键: 01.if (!vis[i]) printf("%d\n", i); 02.vis[d(i)] = true; 完整代码: 01.#include<cstdio> 02.const int maxn = 100000