zoukankan      html  css  js  c++  java
  • PTA (Advanced Level) 1015 Reversible Primes

    Reversible Primes

      A reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.

      Now given any two positive integers N (<) and D (1), you are supposed to tell if N is a reversible prime with radix D.

    Input Specification:

      The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.

    Output Specification:

      For each test case, print in one line Yes if N is a reversible prime with radix D, or No if not.

    Sample Input:

    73 10
    23 2
    23 10
    -2
    

    Sample Output:

    Yes
    Yes
    No

    解题思路:
      本题给出一个十进制数字n,之后给出其进制d,要求判断其是不是可逆素数,若是可逆素数输出Yes否则输出No。

      本题的可逆素数要求给出数字本身是素数且,将其转化为给出的进制,反转后重新转化为十进制还是素数。

      如:23的2进制为10111反转后为11101 = 29,29与23都是素数,所以23是可逆素数。

      由于本题有多组输入,所以可以用素数筛(埃氏筛法)先将素数打表。

      埃氏筛法:

    int prime[maxn];
    bool vis[maxn] = {false};
    int cnt = 0;
    void findPrime(){   //埃氏筛法
        //每找到一个一个素数将其倍数都标记为不是素数
        //时间复杂度O(n loglogn)
        for(int i = 2; i < maxn; i++){
            if(vis[i] == false){    //i是素数
                prime[cnt++] = i;
                for(int j = 2 * i; j < maxn; j += i){
                    vis[j] = true;  //标记所以i的倍数
                }
            }
        }
    }

      之后根据我们得到的素数判断输入的数是否为素数,若不是素数直接输出No,若是素数则将其转化为对应进制的数字后反转,将反转后得到的数字重新转化为10进制,在判断其是不是素数,是的话输出Yes否则输出No。

      这样我们就需要两个函数,一个用来将其他进制数转化为10进制。另一个用来将10进制转化为其他进制并反转。

      转化为d进制:

    string decimalToOther(int num, int radix){  //将十进制数转化为其他进制数
        string ans;
        //ans从最低位开始记录,结束后得到的直接就是转化后数字的反转
        while(num){
            ans += (num % radix) + '0';
            num /= radix;
        }
        return ans;
    }

      转化为10进制

    LL toDecimal(string num, int radix){    //将某进制数转化为10进制
        LL ans = 0;
        for(int i = 0; i < num.size(); i++){
            ans = ans * radix + (num[i] - '0');
            if(ans < 0)
                return -1;
        }
        return ans;
    }

      AC代码

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn = 1e6+10;
     5 int prime[maxn];
     6 bool vis[maxn] = {false};
     7 int cnt = 0;
     8 void findPrime(){   //埃氏筛法
     9     //每找到一个一个素数将其倍数都标记为不是素数
    10     //时间复杂度O(n loglogn)
    11     for(int i = 2; i < maxn; i++){
    12         if(vis[i] == false){    //i是素数
    13             prime[cnt++] = i;
    14             for(int j = 2 * i; j < maxn; j += i){
    15                 vis[j] = true;  //标记所以i的倍数
    16             }
    17         }
    18     }
    19 }
    20 LL toDecimal(string num, int radix){    //将某进制数转化为10进制
    21     LL ans = 0;
    22     for(int i = 0; i < num.size(); i++){
    23         ans = ans * radix + (num[i] - '0');
    24         if(ans < 0)
    25             return -1;
    26     }
    27     return ans;
    28 }
    29 string decimalToOther(int num, int radix){  //将十进制数转化为其他进制数
    30     string ans;
    31     //ans从最低位开始记录,结束后得到的直接就是转化后数字的反转
    32     while(num){
    33         ans += (num % radix) + '0';
    34         num /= radix;
    35     }
    36     return ans;
    37 }
    38 int n, d;
    39 int main()
    40 {
    41     findPrime();    //素数打表
    42     while(scanf("%d", &n) != EOF && n > 0){
    43         //输入n,n < 0时直接结束运算
    44         scanf("%d", &d);
    45         //输入进制d
    46         if(vis[n] == true || n <= 1){   //若n不是素数直接输出No进行下一次运算
    47             printf("No
    ");
    48             continue;
    49         }
    50         string toRadix = decimalToOther(n, d);
    51         //将n转化为d进制并反转
    52         int ans = toDecimal(toRadix, d);
    53         //将反转的数重新转化为10进制
    54         if(vis[ans] == true || ans <= 1){//若反转的数不是素数输出No
    55             printf("No
    ");
    56             continue;
    57         }
    58         printf("Yes
    ");    //否则输出Yes
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/suvvm/p/10138228.html
Copyright © 2011-2022 走看看