zoukankan      html  css  js  c++  java
  • PAT.Radix(史上最 NT 题, (其实是我脑瘫/ 哭唧唧))

    1010 Radix (25分)

     

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.

    Now for any pair of positive integers N1​​ and N2​​, your task is to find the radix of one number while that of the other is given.

    Input Specification:

    Each input file contains one test case. Each case occupies a line which contains 4 positive integers:

    
    N1 N2 tag radix
    
    
     

    Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.

    Output Specification:

    For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.

    Sample Input 1:

    6 110 1 10
    
     

    Sample Output 1:

    2
    
     

    Sample Input 2:

    1 ab 1 2
    
     

    Sample Output 2:

    Impossible


    /*
        本题大意:给出两个任意进制的数字,让你判断将他们都转换为十进制后是否相等。
        注意其中一个数字和他的进制已经给出,另一个数只给出数某种进制下的编码,让
        你求出这个数的最小进制数,使得这两个数字在十进制下相等。
        
        思路:题目给出2 ~ 36 其实是一个坑,答案进制数有可能超大,但其范围在
        (这个数中最大的数字 + 1,已知数字 + 1)这个范围内,知道范围,求最小值
        我们直接二分答案就行了。
    */
    #include <iostream>
    #include <string>
    #include <cmath>
    #include <algorithm>
    #define mid ((l + r) >> 1)
    using namespace std;
    
    typedef long long ll;
    
    ll inf = 8e18;
    
    string s1, s2;
    ll n1, n2;
    
    ll quickly_pow(ll a, int b) {
        ll ans = 1;
        while(b) {
            if(b & 1) {
                ans *= a;
            }
            a *= a;
            b >>= 1;
        }
        return ans;
    }
    
    ll get_decimal(string s, ll radix) {
        ll ans = 0;
        int len = s.size();
        for(int i = len - 1; i >= 0; i --) {
            if(s[i] > '9') ans += (s[i] - 'a' + 10) * quickly_pow(radix, len - i - 1);
            else ans += (s[i] - '0') * quickly_pow(radix, len - i - 1);
            if(ans > n1 || ans < 0) return n1 + 1;
        }
        return ans;
    }
    
    int main() {
        int tag, radix;
        while(cin >> s1 >> s2 >> tag >> radix) {
            n1 = inf;
            if(tag == 2) swap(s1, s2);
            n1 = get_decimal(s1, radix);
            char c = *max_element(s2.begin(), s2.end());
            ll l = c < '9' ? (c - '0' + 1) : (c - 'a' + 11), r = n1 + 1, ans = inf, temp;
            while(l <= r) {
                temp = get_decimal(s2, mid);
                if(temp > n1) r = mid - 1;
                else if(temp < n1) l = mid + 1;
                else {
                    ans = min(ans, mid);
                    r = mid - 1;
                }
            }
            if(ans == inf) cout << "Impossible" << endl;
            else cout << ans << endl;
        }
        return 0;
    }


  • 相关阅读:
    没吃过猪肉,却想见识下猪跑
    程序员修电脑
    csdn 新排名系统参考的部分指标
    如何快速适应新工作
    前端学习指北
    公号文章整理
    BUI 视频,音频在线播放
    原生图片上传,图片格式和图片大小处理
    获取路由拼接参数
    Axure RP9调用后端接口操作步骤
  • 原文地址:https://www.cnblogs.com/bianjunting/p/12502505.html
Copyright © 2011-2022 走看看