大坑来辣!!!!!
1、最小进制为数位上最大数+1 .比如23a最大的数位为a,最小进制为11. 测试点0
2、题目说的为36进制,但是求的基远远不止36. 甚至long long 都有可能爆掉。所以需要二分查找而且要考虑long long溢出的时候值为负。
PS:19的测试数据为:17 321 1 10 别问我怎么知道的。都是泪。。。。
#include <iostream>
#include <string>
#include <cmath>
#include <climits>
using namespace std;
int Alpha2int(char c) { //数字转换
if (int(c) >= int('0') && int(c) <= int('9')) {
return (int(c) - 48);
}
else
return int(c) - 87;
}
long long Str2int(string s ,int r) { //返回以r为基的十进制数
long long sum = 0;
for (int i = 0; i < s.size(); i++) {
sum *= r;
sum += Alpha2int(s[i]);
if (sum < 0) // 如果溢出
return -1;
}
return sum;
}
long long FindRadix(long long start, long long end, long long n1 ,string n2){//2分查找找基底
long long mid = (start + end) / 2;
long long temp = Str2int(n2, mid);
long long result = -1;
if (start <= end) {
if (temp == -1 || temp > n1) {//溢出减少Radix
result = FindRadix(start, mid - 1, n1, n2);
}
else if (temp < n1) {
result = FindRadix(mid + 1, end, n1, n2);
}
else {
result = mid;
}
}
return result;
}
int main() {
string N1, N2;
string temp;
int tag, r;
bool isEqual = false;
cin >> N1 >> N2 >> tag >> r;
if (tag == 2) { //交换N1 N2次序
temp = N2;
N2 = N1;
N1 = temp;
}
long long n1 = 0, n2 = 0;
n1 = Str2int(N1, r);
long long Radix = 0;
long long MinRadix = 2; //下界为2 最少为2进制
long long MaxRadix = n1 + 1;//上界
for (int i = 0; i < N2.size(); i++) { //测试点0 例数里面有b 至少为12进制
if (Alpha2int(N2[i]) >= MinRadix)
MinRadix = Alpha2int(N2[i]) + 1; //要加1
}
long long MidRadix = 0;
long long tempN2 = 0;
//--------------------------------------------------
//法二:
Radix = FindRadix(MinRadix, MaxRadix, n1, N2);
if (Radix != -1) {
cout << Radix << endl;
}
else {
cout << "Impossible" << endl;
}
return 0;
//法结束:
//--------------------------------------------------
//--------------------------------------------------
//法一:
//for (; MinRadix <= MaxRadix;) {
// MidRadix = (MinRadix + MaxRadix) / 2;
// tempN2 = Str2int(N2, MidRadix);
// if (tempN2 == -1 || tempN2 > n1) {
// MaxRadix = MidRadix - 1;
// }
// else if (tempN2 < n1) {
// MinRadix = MidRadix + 1;
// }
// else
// {
// isEqual = true;
// break;
// }
//}
//if (isEqual) {
// cout << MidRadix << endl;
//}
//else {
// cout << "Impossible" << endl;
//}
//法一结束
//--------------------------------------------------
}