线性筛法证明

判断素数(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\n");
        else
            printf("No\n");
    }
    return 0;
}

 

posted @ 2018-07-18 11:08  moxin0509  阅读(243)  评论(0编辑  收藏  举报