这是个比较坑的题。无论时间还是内存卡的都很紧,也暴露出一些问题。
开数组要用bool类型,因为bool只有一个字节,而int是4个字节。否则会内存超限。
另外题目要求两素数之和也是素数,显然两奇数之和或者两偶数之和都是偶数,而偶数除了2都不是素数(此话不严谨),只可能是奇数与偶数的和,得到奇数才可能是素数,那么这个偶数素数肯定是2,另外一个素数(必定是奇数)需要挨个遍历了。
为了得到所有素数,使用了素数表。为了打印出各个素数,又用了一个数组(不需要开太大)存符合的数字。
我会牢牢地记住这个题。
比赛的时候没做出来。后来得到别人的提示写出代码交上居然还不对,反复改了又改老是WA,几乎绝望了。最后问别人才知道原来一开始要先输出符合的对数然后才是打印。
开数组要用bool类型,因为bool只有一个字节,而int是4个字节。否则会内存超限。
另外题目要求两素数之和也是素数,显然两奇数之和或者两偶数之和都是偶数,而偶数除了2都不是素数(此话不严谨),只可能是奇数与偶数的和,得到奇数才可能是素数,那么这个偶数素数肯定是2,另外一个素数(必定是奇数)需要挨个遍历了。
为了得到所有素数,使用了素数表。为了打印出各个素数,又用了一个数组(不需要开太大)存符合的数字。
我会牢牢地记住这个题。
比赛的时候没做出来。后来得到别人的提示写出代码交上居然还不对,反复改了又改老是WA,几乎绝望了。最后问别人才知道原来一开始要先输出符合的对数然后才是打印。
居然没注意到!
我该得到的教训是,当你写出一份代码,试遍各种数据,自以为完整无误,但交上总是不对,那么就再去读一遍题。可能会有你忽略的条件或细节,一点点就足以致命了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
bool p[1000005]={0};
int main()
{
//freopen("in.txt","r",stdin);
p[1]=1;
p[2]=0;
for(int i=2;i<=1000000;++i)
for(int j=i+i;j<=1000000;j+=i)
if(!p[j]) p[j]=1;
int N;
scanf("%d",&N);
int count=0;
int a[10000]={0};
for(int i=2;i<=N;++i)
if(!p[i]&&!p[2+i]&&2+i<=N)
a[count++]=i;
printf("%d\n",count);
for(int i=0;i<count;++i)
printf("2 %d\n",a[i]);
return 0;
}