POJ原址:POJ2739
今天做这题实在太慢了,现在已经16:45,基本上从早上十点多开始做,不停在修改,不停的测试,犯了很多各种各样的错误,太可怕了。
主要错误的纠正写在第一个程序里了。
参考的是以下这篇:
第一个程序:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int prime[10001]={0},Is[10001]={0},i,k,m,num=0;
Is[0]=Is[1]=0;
for(m=2;m<=10000;m++)
{
k=sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0) //因为这里的m之前写成了k,害得我重复了n遍的素数表
break;
}
if(i<=k)
Is[m]=0;
else
Is[m]=1;
}
for(i=0;i<10000;i++)
{
if(Is[i]==1)
prime[num++]=i;
}
//构建素数表,但是为什么把这10000个数输出就那么奇怪呢?
//素数表构建完全正确,时间已经到了下午15:44
int n,result=0,j;
cin>>n;
while(n)
{
if(n==0||n==1)
result=0;
else
for(i=0;i<num;i++) //循环直到10000以内所有素数个数的最大值
{
int sum=0;//对sum每一次循环都要归零,不能放在开始,傻
j=i;
while(sum<n)
{
sum=sum+prime[j];
j++;
if(sum==n)
result++;
}
}
cout<<result<<endl;
result=0;//最后一坑,试过无数数据才发现,原来是因为没有把result清空,此时已经16:21,尝试提交吧
cin>>n;//这条语句掉了害我多搞了好久,就因为跟参考的程序不一样。
}
return 0;
}
之前为了找到result的那个错误,测试了n=3,但是也没用,单独算3,根本发现不了累加了。
/*测试数据:
n=3
i=0
sum=0
j=0
sum<n 0<3
sum=prime[0]=2
j=1
sum!=n 2!=n
result=0
sum=2<n=3
sum=2+prime[1]=2+3=5
sum!=n 5!=3
i=1
j=1
sum=0
sum=prime[1]=3
j=2
sum==3
result=1
i=2
j=2
sum=prime[2]=5
j=3
result=1
the end
测试完毕
此处是为了试验n=3,没有任何问题,后来改变num,也没有问题,最后发现是result没有清空*/
后来还试了很久的num,一直到所有素数的终值1229都没有问题,证明num是没问题的。
可是提交两次,出现两次compile error,应该是因为sqrt,算了,那就不用sqrt了。
第二个程序:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int prime[10001]={0},Is[10001]={0},i,m,num=0;
Is[0]=Is[1]=0;
for(m=2;m<=10000;m++)
{
for(i=2;i<m;i++)
{
if(m%i==0)
break;
}
if(i<m)
Is[m]=0;
else
Is[m]=1;
}
for(i=0;i<10000;i++)
{
if(Is[i]==1)
prime[num++]=i;
}
int n,result=0,j;
cin>>n;
while(n)
{
if(n==0||n==1)
result=0;
else
for(i=0;i<num;i++)
{
int sum=0;
j=i;
while(sum<n)
{
sum=sum+prime[j];
j++;
if(sum==n)
result++;
}
}
cout<<result<<endl;
result=0;
cin>>n;
}
return 0;
}
第三个程序:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int prime[10001]={0},Is[10001]={0},i,m,num=0;
Is[0]=Is[1]=0;
for(m=2;m<=10000;m++)
{
for(i=2;(i*i)<=m;i++)//此处是像大神们那么做的
{
if(m%i==0)
break;
}
if((i*i)<=m)//还有这里,不能忘记要改
Is[m]=0;
else
Is[m]=1;
}
for(i=0;i<10000;i++)
{
if(Is[i]==1)
prime[num++]=i;
}
int n,result=0,j;
cin>>n;
while(n)
{
if(n==0||n==1)
result=0;
else
for(i=0;i<num;i++)
{
int sum=0;
j=i;
while(sum<n)
{
sum=sum+prime[j];
j++;
if(sum==n)
result++;
}
}
cout<<result<<endl;
result=0;
cin>>n;
}
return 0;
}