0%

PAT-1010 Radix

1010 Radix

题意

给定两个数,并告诉其中一个数的进制数,然后判断是否存在一个进制使得两个数相等

思路

这题题目很好理解,就是做起来真难受,各种部分正确
总体思路就是使用二分法找进制,按照进制转换成数字.
其中二分的下限是所有进制数中最大数加1,上限是此数本身。
要考虑数位益处的问题,溢出后其数符号位为负

源码

line_number: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
#include<cctype>
#include<algorithm>
#include<cmath>

using namespace std;

//字符串按进制转换为长整型
long long str2RadixNum(string strNum, long long llRadix)
{
long long llNum = 0;
for(auto pT = strNum.begin(); pT != strNum.end(); pT++)
{
llNum = llNum * llRadix + (isdigit(*pT) ? (*pT - '0') : (*pT - 'a' + 10));
}

return llNum;
}

// 二分法寻找进制
long long findNumRadix(string strNum, long long llTagNum)
{
long long strMaxChar = *max_element(strNum.begin(), strNum.end());
long long llLow = (isdigit(strMaxChar) ? strMaxChar - '0' : strMaxChar - 'a' + 10) + 1;
long long llHigh = max(llLow,llTagNum);
while(llLow <= llHigh)
{
long long llMedium = (llLow + llHigh) / 2;
long long llMediumRadixNum = str2RadixNum(strNum, llMedium);

if(llMediumRadixNum < 0 || llMediumRadixNum > llTagNum) //防止溢出
{
llHigh = llMedium - 1;
}
else if(llMediumRadixNum < llTagNum)
{
llLow = llMedium + 1;
}
else
{
return llMedium;
}
}
return -1;
}

int main()
{
string strN1;
string strN2;
int iTag;
long long llRadix;
while(cin>> strN1 >> strN2 >> iTag >> llRadix)
{
long long llTagNum = iTag == 1 ? str2RadixNum(strN1, llRadix) : str2RadixNum(strN2, llRadix);
long long llResult = iTag == 1 ? findNumRadix(strN2, llTagNum) : findNumRadix(strN1, llTagNum);
llResult == -1 ? cout << "Impossible" <<endl : cout<< llResult <<endl;
}

return 0;
}