判断素数(2)
TimeLimit:2500MS MemoryLimit:128MB
64-bit integer IO format:%lld
Problem Description
输入一个数n(2<=n<=10^7),输出它是否是素数。如果是,输出Yes,否则输出No。
Input
多组测数据(T<=10^6),每组有一个数字 n(2<=n<=10^7)。
数据量较大,建议使用scanf 进行读入。
Output
每个测试数据输出”Yes”或”No”(不包含引号)
SampleInput
2 3 4 5
SampleOutput
Yes Yes No Yes
推导证明:
假设c=a*b
可以存在向上筛掉c*b
此时c%b==0
如果不跳出
存在另一个素数d
c*d=(a*b*d)=(a*d)*b
此时可得a*d>c
那么存在向下循环
会重复筛去a*d*b
为什么会是c%b==0结束呢
取余等于0的情况下
=(a*b)*b(调换位置)依旧=(a*b)*b
不会出现大于的情况
小于的情况(e<b)
=(a*b)*e=(a*e)*b
(a*e)<(a*b)
所以(a*e)在(a*b)前面,所以应该先跑过了
i对应c
prime[j]对应素数数组
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1e7+5; int vids[MAXN],prime[MAXN]; /** 推导证明: 假设c=a*b 可以存在向上筛掉c*b 此时c%b==0 如果不跳出 存在另一个素数d c*d=(a*b*d)=(a*d)*b 此时可得a*d>c 那么存在向下循环 会重复筛去a*d*b 为什么会是c%b==0结束呢 取余等于0的情况下 =(a*b)*b(调换位置)依旧=(a*b)*b 不会出现大于的情况 小于的情况(e<b) =(a*b)*e=(a*e)*b (a*e)<(a*b) 所以(a*e)在(a*b)前面,所以应该先跑过了 i对应c prime[j]对应素数数组 **/ void primes() { int i,j,temp,top; top=0; memset(vids,0,sizeof(vids)); for(int i=2;i<MAXN;i++) { if(!vids[i]) { prime[top++]=i; } for(int j=0;prime[j]*i<MAXN;j++) { vids[prime[j]*i]=1; if(i%prime[j]==0) break; } } } int main() { primes(); int n; while(~scanf("%d",&n)) { if(vids[n]==0) printf("Yes "); else printf("No "); } return 0; }