PAT甲级1010 Radix (25分)|C++实现

tech2023-11-13  77

一、题目描述

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 N 1 N_1 N1 and N 2 N_2 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

​​Output Specification:

For each test case, print the total time on a single line.

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible

二、解题思路

个人认为这道题还是比较难的,倒不是具体的代码实现难,而是有点难想。给出两个数,及其中一个数的进制,求另外一个数的进制。我们可以把已知进制的数先转换成十进制,进制转换的功能用函数LL change(string str, LL radix)实现。随后查找另一个数的进制。事实上,这是一个考察二分查找的题。下界是很好确定的,我们知道,二进制中的数字不可能有超过1的数,八进制的数字不可能有超过7的数,这样我们就可以确定所求进制的下界。这个功能用函数minRadix(string str)来实现。至于上界,显然,要比下界大,但是一定不会大于另一个数的十进制。上下界确定之后,可以用二分法确定最终的radix,若查找失败,输出“Impossible”。

三、AC代码

#include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; typedef long long LL; LL change(string str, LL radix) { LL tmp, sze = str.size(); LL ans = 0; for(LL i=0; i<sze; i++) { if(str[i]>='a' && str[i] <= 'z') tmp = str[i] - 'a' + 10; else tmp = str[i] - '0'; ans = ans*radix + tmp; } if(ans < 0) return -1; return ans; } int minRadix(string str) { int ans=1, tmp, sze = str.size(); for(int i=0; i<sze; i++) { if(str[i]>='a' && str[i] <= 'z') tmp = str[i] - 'a' + 10; else tmp = str[i] - '0'; if(tmp >= ans) ans = tmp + 1; } return ans; } int main() { string str[2]; int tag; LL radix; LL deci; cin >> str[0] >> str[1] >> tag >> radix; deci = change(str[tag-1], radix); int mk = tag == 1 ? 1 : 0; LL low = minRadix(str[mk]), high = max(deci, low), mid = (high+low)/2, tmp = change(str[mk], mid); while(high >= low) { if(tmp < 0 || tmp > deci) { high = mid - 1; mid = (high+low)/2; } else if(tmp < deci) { low = mid + 1; mid = (high+low)/2; } else break; tmp = change(str[mk], mid); } if(high < low) printf("Impossible"); else printf("%lld", mid); return 0; }
最新回复(0)