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;
}


相关文章
uva10783 Odd Sum
uva10783 Odd Sum
56 0
LeetCode 216. Combination Sum III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
113 0
LeetCode 216. Combination Sum III
【欧拉计划第 3 题】最大质因数 Largest prime factor
【欧拉计划第 3 题】最大质因数 Largest prime factor
270 0
【1059】Prime Factors (25 分)
【1059】Prime Factors (25 分) 【1059】Prime Factors (25 分)
105 0
POJ 1844 Sum
POJ 1844 Sum
108 0
|
安全
D-POJ-3126 Prime Path
Description The ministers of the cabinet were quite upset by the message from the Chief of...
1131 0