美文网首页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