1010 Radix


1010 Radix

题目

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

分析

本题大体上的思路比较简单,就是使用二分查找的思想,找到合适的那个radix。但是细节上的东西非常多。首先一个坑的点就是题目中没有给出radix等数据的范围,必须要使用long long类型才行,其转化过程中还可能产生溢出。下面结合代码分析

代码

#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>

using namespace std;

long long convert(string n, long long radix){ //进制转换 radix进制转为10
    long long sum = 0;
    int index = 0, tmp = 0;
    for(auto it=n.rbegin(); it != n.rend(); it++){
        tmp = isdigit(*it)?*it-'0':*it-'a'+10;
        sum += tmp * pow(radix, index++);
    }
    return sum;
}

// 二分法 寻找合适的radix n是待确定的数字 num是确定进制的数字
long long find_radix(string n, long long num){ 
    char it = *max_element(n.begin(), n.end()); // stl库 寻找最大的元素
    // 这里使用 max_element用作下限 是因为一个数中不会出现比进制更大的digit
    long long low = (isdigit(it)?it-'0':it-'a'+10)+1;// 将digit转化为数值
    long long high = max(num, low); //用两者中较大的一个作上限
    while(low <= high){
        long long mid = (low+high)/2;
        long long t = convert(n, mid); // 根据mid进制转换的结果
        if(t < 0|| t>num){
            high = mid - 1;
        } else if(t == num){
            return mid;
        } else{
            low = mid + 1;
        }
    }
    return -1;
}

int main(){
    string n1, n2;
    long long tag=0, radix=0, result_radix;
    cin >> n1 >> n2 >> tag >> radix;
    result_radix = tag==1 ? find_radix(n2, convert(n1, radix)): find_radix(n1, convert(n2, radix));
    if(result_radix != -1){
        printf("%lld", result_radix);
    } else{
        printf("Impossible");
    }
    return 0;
}

评论
 上一篇
C++ socket编程小结 C++ socket编程小结
C++ socket编程小结#随手笔记 最近做毕设的时候涉及到了这方面的知识,也是经过多次遇坑,趁着还有印象记录一下。本篇主要涉及Linux/unix(MAC OS)下的socket编程,win环境下的socket略有不同。 sock
2020-12-19
下一篇 
1085_Perfect_Sequence 1085_Perfect_Sequence
1085 Perfect Sequence题目Given a sequence of positive integers and another positive integer p. The sequence is said to be
2020-05-23
  目录