NYOJ 169题 素数

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值