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