您的位置:首页 > 其它

SGU:231 Prime Sum

2013-07-27 21:01 197 查看
这是个比较坑的题。无论时间还是内存卡的都很紧,也暴露出一些问题。

开数组要用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: