PAT甲级 1010. Radix (25分)

简介: PAT甲级 1010. Radix (25分)

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
结尾无空行
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
// 变为10进制数
LL convert(string str, LL radix)
{
    LL len = str.length(), decimal = 0;
    for (LL i = 0; i < len; i++)
    {
        LL n = isdigit(str[i]) ? str[i] - '0' : str[i] - 'a' + 10;
        decimal += n * pow(radix, len - i - 1);
    }
    return decimal;
}
// 二分查找
LL find_radix(string str, LL n1)
{
    char n = *max_element(str.begin(), str.end());
    LL left = isdigit(n) ? n - '0' + 1 : n - 'a' + 11;
    LL right = n1 + 1;
    while (left <= right)
    {
        LL mid = (left + right) / 2;
        LL n2 = convert(str, mid);
        if (n2 < 0 || n2 > n1)
        {
            right = mid - 1;
        }
        else if (n2 == n1)
        {
            return mid;
        }
        else
        {
            left = mid + 1;
        }
    }
    return -1;
}
int main()
{
    string s1, s2;
    LL tag, radix;
    cin >> s1 >> s2 >> tag >> radix;
    if (tag == 2)
    {
        swap(s1, s2);
    }
    LL n1 = convert(s1, radix);
    LL rst = find_radix(s2, n1);
    if (rst != -1)
    {
        printf("%lld", rst);
    }
    else
    {
        printf("Impossible");
    }
    return 0;
}


先把已知进制数转化为十进制,然后未知进制数用不同进制转十进制代入比较,这里使用的是二分查找的方法进行优化。

目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能
PTA之N个数求和(细节题)天梯赛
编程题,要求计算以分子/分母形式给出的一组有理数的和,输出结果也要是最简有理数形式。输入包含正整数N(N≤100)及N个有理数,输出为和的最简形式。示例:输入5个数2/5, 4/15, 1/30, -2/60, 8/3,输出3 1/3;输入2个数4/3, 2/3,输出2。代码中包含求最大公约数的函数和计算有理数和的主要逻辑。
42 0
PTA第五章7-13 求一批整数中出现最多的个位数字
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
125 0
|
算法 C++
【PAT甲级 - C++题解】1010 Radix
【PAT甲级 - C++题解】1010 Radix
69 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
77 0
PTA 7-2 数字之王 (20 分)
给定两个正整数 N 1 ​ <N 2 ​ 。把从 N 1 ​ 到 N 2 ​ 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止
121 0
|
存储 人工智能
PAT-2021年秋季考试 乙级 7-4 数组与链表 (20 分)
让我们来设计这样一种数组与链表结合的整数存储的结构 A
131 0
|
测试技术
PTA 1021 个位数统计 (15 分)
给定一个 k 位整数 N=d k−1 ​ 10 k−1 +⋯+d 1 ​ 10 1 +d 0 ​ (0≤d i ​ ≤9, i=0,⋯,k−1, d k−1 ​
191 0
PTA 1056 组合数的和 (15 分)
给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。
118 0
PTA 1053 住房空置率 (20 分)
在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。
119 0
|
测试技术
PAT乙级1008.数组循环右移问题(20分)
PAT乙级1008.数组循环右移问题(20分)
143 0