閱讀523 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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


最後更新:2017-04-03 14:53:40

  上一篇:go Bad version number in .class file (unable to load class ***) 解決
  下一篇:go 劍指Offer之1384:二維數組中的查找