NEFU 2 猜想

来源:互联网 发布:算法与程序的关系 编辑:程序博客网 时间:2024/05/16 17:19

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

#include<stdio.h>#include<iostream>#include<string.h>#define maxn 1<<24using namespace std;//bool isNotprime[maxn];位置必须是这样极其诡异,呵呵,我对编译器还是了解太少了//首先必须是bool型,然后初始化的时候也得注意int prime[1080000];//经过计算式n/ln(n) = 1048576,但是必须开到1080000//否则超memorybool 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暴力,很好用~~如果有谁敲完了可以交流下,我就偷个懒~~

0 0
原创粉丝点击