NEFU 2 猜想

筛法学习第一题就让我感觉不好用

#include<stdio.h>
#include<iostream>
#include<string.h>
#define maxn 1<<24
using namespace std;
//bool isNotprime[maxn];位置必须是这样极其诡异,呵呵,我对编译器还是了解太少了
//首先必须是bool型,然后初始化的时候也得注意
int prime[1080000];//经过计算式n/ln(n) = 1048576,但是必须开到1080000
//否则超memory
bool isNotprime[maxn];
int total;
void makeprime()
{
    total = 0;
    memset(isNotprime,true,sizeof(isNotprime));
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=maxn;i++)
    {
        if(isNotprime[i]==true)
        {
            prime[total] = i;
            total++;
        }
        for(int j=0;j<total&&i*prime[j]<=maxn;j++)
        {
            isNotprime[i*prime[j]] = false;
            if(i%prime[j] == 0)
                break;
        }
    }
}
int main()
{
    makeprime();
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int ans = 0;
        for(int i=0;n/2>=prime[i];i++)
        {
            if(isNotprime[n-prime[i]]==true)
                ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
有兴趣的请继续往下看,有几点我想总结下:

1. 本来数据量不大,可以直接用普通筛法,但是用了线性筛法之后出现了一些问题,以下是针对线性筛法的一些测试

2. 题目数据是2^24,所以对于数组来说有点大,因此要用bool变量存储isNotprime[i],用int会错(可以照着代码改下测试),而prime[i]数组则不能开到2^24,否则提交后超memory(可以提交测试),因此需要用素数定理计算:n/in(n)= 1048576,所以一开始我开到1050000,但是运行后会直接溢出,shit........(可以测试一下),最后至少要开到1080000才不会溢出。

3. 果然数据一大,数组就是不可靠........另外用bool的话有两种初始化的办法,一种使用0和1初始化,还有一种使用true和false初始化,两种应该都是可以的,但是一定要注意代码的习惯,用true的if语句就是if(isNotprime[i]),用0的语句就是if(!isNotprime[i])

4. 写线性筛法应该是可以用map做一个映射的,浙江校赛有道题就是用map暴力,很好用~~如果有谁敲完了可以交流下,我就偷个懒~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值