SGU:231 Prime Sum

这是个比较坑的题。无论时间还是内存卡的都很紧,也暴露出一些问题。


开数组要用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;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值