美文网首页PTA甲级
进制转换+判素数 | 1015 Reversible Prime

进制转换+判素数 | 1015 Reversible Prime

作者: zilla | 来源:发表于2019-01-01 19:33 被阅读0次

    判素数,参考:https://www.cnblogs.com/xiehongfeng100/p/4332998.html

    按照定义 O(sqrt(n))

    对于一个小于num的正整数x,如果num不能整除x,则num必然不能整除num/x (num = num/x * x)。反之相同。
    我们又知num =√num*√num。 如果n除以大于√num的数,必得到小于√num的商,而小于√num的整数已经在2到√num的整数试过了,就没有必要再试(√num, num)范围内的数了。
    for(int i=2;i*i<=n;i++)

    筛法

    筛法的思想是去除某个范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为合数。这个算法效率很高,但占用空间较大。
    一个素数p只有1和p这两个约数,并且它的约数一定不大于其本身。因此,我们下边方法来筛选出来素数:
    1)把从2开始的、某一范围内的正整数从小到大顺序排列;
    2)剩下的数中选择最小的素数,然后去掉它的倍数。
    3)依次类推,直到循环结束。

    这种筛选法动态图如下:

    筛法图解
    相关实现,见素数基本

    题目链接
    注意:<2的数均认为不是素数(测试点2)

    #include <stdio.h>
    #include <math.h>
    int number,radix;
    bool isPrime(int number){
        if(number<2)
            return false;
        int bound=int(sqrt(number));
        for (int i = 2; i <= bound; ++i) {
            if(number%i==0)
                return false;
        }
        return true;
    }
    
    int num_reverse_2_decimal(){
        int digit[20],reverse_value=0;
        int res=number,i;
        for (i = 0;; ++i) {
            digit[i]=res%radix;
            res/=radix;
            if(res==0)
                break;
        }
        int base=1;
        for(;i>=0;i--){
            reverse_value+=base*digit[i];
            base*=radix;
        }
        return reverse_value;
    }
    
    int main() {
        while (scanf("%d",&number)!=EOF){
            if(number<0)
                break;
            scanf("%d",&radix);
            if(isPrime(number)&&isPrime(num_reverse_2_decimal()))
                puts("Yes");
            else
                puts("No");
        }
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:进制转换+判素数 | 1015 Reversible Prime

        本文链接:https://www.haomeiwen.com/subject/qfpnlqtx.html