ZJUT1645魔法阵II判断素数

    技术2022-05-20  47

    Problem Address:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1645

     

    这道题开始看起来好像好点难,但是实际上并不是如此。

     

    有10000组数据,又要在1000MS内完成,每个数又是在[1,2000000]内。

     

    再看一下题目,如果不是素数则输出0。那么是素数呢?

     

    随便求几个素数之后就可以发现该素数减一就是答案。

     

    所以这道题其实就是判断素数。

     

    我用了朴素筛选。速度也不是很慢。

     

    以下贴代码:

     

    //Time:94MS  Memory:2116K

    #include <iostream>using namespace std;const int maxn=2000005;bool *notprime = (bool*)malloc(sizeof(bool)*maxn);int main(){ int n,i,j; notprime[0]=true; notprime[1]=true; for (i=2; i<maxn; i++) notprime[i]=false;

     for (i=2; i<maxn; i++)//该循环是朴素筛选 {  if (!notprime[i])  {   if (i*i>maxn) break;//对某个素数的平方以上的倍数进行筛选   for (j=i*i; j<maxn; j+=i) notprime[j]=true;  } } while(scanf("%d", &n)!=EOF) {  if (notprime[n]) printf("0/n");  else printf("%d/n", n-1); }

     free(notprime); return 0;}

     

    刚写完这个解题报告马上又去试了一下线性筛选:

     

    代码如下:

     

    //线性筛选利用的是每个合数都有一个最小质因子

    //Time:78MS  Memory:9948K

     

    #include <iostream>using namespace std;const int maxn=2000005;bool *notprime = (bool*)malloc(sizeof(bool)*maxn);int *primelist = (int*)malloc(sizeof(int)*maxn);int primenum;int main(){ int n,i,j; notprime[0]=true; notprime[1]=true; for (i=2; i<maxn; i++) notprime[i]=false; for (i=4; i<maxn; i+=2) notprime[i]=true;//把偶数筛掉 primenum = 0; for (i=3; i<maxn; i+=2) {  if (!notprime[i])//如果是质数就加入质数列表  {   primelist[primenum] = i;   primenum++;  }  for (j=0; j<primenum && i*primelist[j]<maxn; j++)//对为筛选的数进行筛选  {   notprime[i*primelist[j]] = true;//以质因子的倍数进行筛选   if (i%primelist[j]==0) break;//如果primelist[j]是i的最小质因子,则也是i*primelist[j]的最小质因子  } } while(scanf("%d", &n)!=EOF) {  if (notprime[n]) printf("0/n");  else printf("%d/n", n-1); }

     free(notprime);

     free(primelist); return 0;}

     

    结果时间上还是差不多,可能是因为数据量比较小的缘故。但是空间上却差别有点大。

     

    p.s.今天又做了一道prim算法的题,debug之后一次AC。哈哈哈~继续加油啦~~(这个p.s.是刚才的……)


    最新回复(0)