NYOJ 169题 素数

来源:互联网 发布:义乌淘宝招聘信息 编辑:程序博客网 时间:2024/05/01 00:23
#include<stdio.h>#include<math.h>int isprime(int m);//方法一int main(){    int T;    scanf("%d", &T);    while(T --)    {        int X, i, j;        scanf("%d", &X);        if(isprime(X))            printf("%dn",X);        else        {            for(i = X-1; i > 2; i --)                if(isprime(i))                    break;            for(j = X+1; ;j ++)                if(isprime(j))                    break;            if(((j - X) <= (X - i)) || i==2)                printf("%dn", j);            else                printf("%dn", i);        }     }    return 0;}int isprime(int m){    int k, i;    k = (int)sqrt(m);//在此写了一个子函数,对单个的数判断是否是素数;    if(m == 1)return 0;    else if(m == 2)return 1;//开始的时候,这道题没有通过的原因是没有搞清楚素数的概念,0,1不是素数,2是素数;    else    {        for(i = 2; i <= k; i++)//换成for(i = 2; i * i < m; i++)也可以,更符合计算机的思维;        {            if(m % i ==0)            break;        }        if(i >= k+1)            return 1;        else            return 0;    } }   /*第二种方法:筛选法*/#include<stdio.h>int main(){    int T, i, j;    bool n[2000]={0};//注意,数组开到了2000,开始时是1001,出现“越界”错误;    n[1]=1;//筛选,就是将不是素数的去掉(标记成1),而把剩下的那些“点”(未标记的,素数)选出来;    for(i = 2; i * i < 2000; i ++)    {            if(n[i]==0)            {                j = i;                while((j += i) < 2000)//按倍数标记,效率高;                {                    n[j]=1;                }            }    }//应该注意一点,997-1009,只有997,1009是素数;    scanf("%d", &T);    while(T --)    {        int X, i, j;        scanf("%d", &X);        if(n[X]==0)            printf("%dn",X);        else        {                for(i = X-1; i > 2; i --)                {                    if(n[i]==0)                        break;                }                for(j = X+1; ;j ++)//这里j并没有设置上限;                {                    if(n[j]==0)                        break;                }                if((j - X) <= (X - i))                     printf("%dn", j);                else                    printf("%dn", i);        }     }    return 0;}    /*这是一位很厉害的学长写的,一看就知,水平不一般*/#include<stdio.h>//只是对continue有点不太明白;int main(){    //筛选法    int i, j;    bool prime[1010] = {0};    prime[1] = 1;    for(i = 2; i < 1010; i++)    {        if(!prime[i])        {            for(j = i + i; j < 1010; j += i)            {                prime[j] = 1;            }        }    }    int t;    scanf("%d", &t);    while(t--)    {        int num;        scanf("%d", &num);        int len;        bool left = 1, right = 1;        for(len = 0; len < 1010; len++)//这个方法的思路跟法二差不多,但是更系统更全面;        {            if(right)            {                if(num + len > 1001)                {                    right = 0;                    continue;                 }                if(!prime[num + len])//非0即1(没有被标记);                {                    printf("%dn", num + len);                    break;//相同距离时,先执行if(right),能找到的话,就跳出//此时if(left)不会执行,所输出的,正好是最大的那一个。if(right)没找到,而if(left)找到了,也就是找到了距离X最近的素数,正好输出来。                }            }            if(left)            {                if(num + len < 2)                {                    left = 0;                    continue;                }                if(!prime[num - len])                {                    printf("%dn", num - len);                    break;                }            }        }    }    return 0;}//附: #include<stdio.h>int main(){    int n;    scanf("%d",&n);    int num;    bool a[60000001] = {0};    int i, j = 0;    for(i = 2; i * i <60000001; i ++)    {        if(a[i] == 0)            for(j = i+i; j < 60000001;j +=i)                a[j] = 1;    }    while(n --)    {        scanf("%d",&num);        printf("%d\n",a[num] );    }    return 0;}


原创粉丝点击