2 solutions

  • 2
    @ 2022-12-22 11:05:29
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll; 
    const ll N=1e6+7;
    ll n;
    int vis[N],prime[N];
    void sieve(ll n)
    {
    	int k=0;
    	memset(vis,0,sizeof(vis));//清零 
    	vis[0]=vis[1]=1;
    	for(int i=2;i<=n;i++)
    	{
    		if(vis[i]==0)
    			prime[k++]=i;
    		for(int j=0;j<k;j++)
    		{
    			if(i*prime[j]>n)//倍增结果超出范围,退出 
    				break;
    			vis[i*prime[j]]=1;//将倍增结果进行标记 
    			if(i%prime[j]==0)//i是前面某个素数的倍数时,退出 
    				break;			
    		}	
    	}
    }
    int main()
    {
    	sieve(N);
    	while(~scanf("%lld",&n))
    	{
    		if(vis[n]==0)printf("Yes\n");
    		else printf("No\n");
    	}
    	return 0;
    }
    
    • 2
      @ 2022-1-19 20:39:01
      #include<iostream>
      #include<cstdio>
      #include<cmath>
      #include<cstdlib>
      #include<cmath>
      #include<cstring>
      #include<algorithm>
      #include<vector>
      #include<string>
      
      using namespace std;
      const int N = 1e5 + 5;
      int prime[N];//定义一个保存素数的数组
      int  c;//定义一个记录素数数组内素数个数的整形
      bool isVisit[N];//定义一个用来判断某个数是否已经被访问的数组
      
      void tell(int n)
      {
      	for (int i = 2; i <= n; ++i)
      	{
      		if (isVisit[i] == false)//如果这个数未被访问,则是素数
      			prime[++c] = i;//把素数保存在素数数组里
      
      		for (int j = 1; j <= c && i * prime[j] <= n; ++j)
      		{
      			isVisit[i * prime[j]] = true;
      			if (i % prime[j] == 0)
      				break;
      		}
      	}
      }
      
      
      int main(void)
      {
      	isVisit[0]=true;
      	isVisit[1]=true;//别漏了这两个点...我连着wa了几次
      	int n = 0;
      	tell(N);
      	while (~scanf("%d", &n))
      	{
      		if(!isVisit[n]) printf("Yes\n");//cout太慢了
      		else printf("No\n");
      	
      	}
      
      	return 0;
      }
      • 1

      Information

      ID
      327
      Time
      55ms
      Memory
      256MiB
      Difficulty
      8
      Tags
      # Submissions
      603
      Accepted
      70
      Uploaded By