2 solutions
-
2
#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
#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