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
思路
本题难度不大,但是有几个测试点比较难以通过,需要注意的点是:
- 题目说数字个数不超过10位,因此根据PAT考试特性,一定有测试用例是10位的数字,因此不能使用int来存储数字,大小不够,需要使用long long类型来存储数字
- 计算可能的基数的时候,一开始使用从2到无穷大进行遍历,一旦某一个基数超出计算结果就退出循环,这样的方法有个问题是速度太慢,因此需要使用二分查找的方法,将O(N)的时间复杂度降低到O(logN)
- 对于某一个基数的运算,有可能计算结果超出long long的范围,由于计算机的特性,溢出的时候,数字会变为负数,因此判定时,如果数字变为负数,证明这个基数过大,不对
- 使用二分查找,需要定义上界跟下界,下界应该是数字字符串最大的数字加1(至少为2),例如一个字符串为
adc
,那么该数字的基数至少为13。上界限的定义比较复杂:首先上界限一定是大于下界限的,其次上界限最多为目标数字的大小+1,比如另一个数字是99,那么上界限最多为99,因为要判断的数的基数一旦大于目标数,不可能与这个数相同
- 给出几个测试用例:
input:
9999999999 9999999999 1 10
output:
10
input:
12 c 1 10
output:
13
input:
99 10 1 10
output:
99
input:
0 0 1 10
output:
2
代码
首先需要定义一个将一个字符串根据基数转化为十进制数的函数:
就是简单的累加
long long number_to_ten(char *a,long long radix)//calculate the number of char with radix
{
long long sum=0,len=strlen(a),mul=1;
for(int i=len-1;i>=0;i