ZJUT1645 魔法阵II 判断素数

来源:互联网 发布:整精米率检验数据 编辑:程序博客网 时间:2024/05/20 16:14

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.是刚才的……)

原创粉丝点击