/*首先是radix的范围问题 最小应该是字母最大值+1, 最大在num和字母最大值+1选最大值
二分法 主要左边界和右边界的更新,不然会陷入死循环...
还有变量名不要冲突 不然一直找不到错在哪.............
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string n1, n2;
int tag, r;
ll maxa=0, maxb=0;
cin >> n1 >> n2 >> tag >> r;
if(n1 == n2) {
cout << r << endl;
return 0;
}
int l1 = n1.length(), l2 = n2.length();
ll a[l1+5], b[l2+5];
for(int i=0; i<l1; i++) {
if(n1[i] <= '9' && n1[i] >= '0') {
a[i] = n1[i]-'0';
} else a[i] = (n1[i]-'a'+10);
maxa = max(maxa, a[i]);
}
for(int i=0; i<l2; i++) {
if(n2[i] <= '9' && n2[i] >= '0') {
b[i] = n2[i]-'0';
} else b[i] = (n2[i]-'a'+10);
maxb = max(maxb, b[i]);
}
ll num = 0;
if(tag == 1) {
for(int i=0; i<l1; i++) {
num *= r;
num += a[i];
}
ll l = maxb+1, rt = max(num, maxb+1);
for(ll i=(l+rt)/2; l<=rt; ) {
ll tmp = 0;
for(int j=0; j<l2; j++) {
tmp *= i;
tmp += b[j];
}
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num || tmp < 0) {//溢出
rt = i-1;
i = (l+rt)/2;
} else {
l = i+1;
i = (l+rt)/2;
}
}
cout << "Impossible" << endl;
} else {
for(int i=0; i<l2; i++) {
num *= r;
num += b[i];
}
ll l = maxa+1, rt = max(maxa+1, num);
for(ll i=(l+rt)/2; l<=rt; ) {
ll tmp = 0;
for(int j=0; j<l1; j++) {
tmp *= i;
tmp += a[j];
}
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num || tmp< 0) {
rt = i-1;
i = (l+rt)/2;
} else {
l = i+1;
i = (l+rt)/2;
}
}
cout << "Impossible" << endl;
}
return 0;
}
//24分 运行超时
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string n1, n2;
int tag, r;
ll maxa=0, maxb=0;
cin >> n1 >> n2 >> tag >> r;
if(n1 == n2) {
cout << r << endl;
return 0;
}
int l1 = n1.length(), l2 = n2.length();
ll a[l1], b[l2];
for(int i=0; i<l1; i++) {
if(n1[i] <= '9' && n1[i] >= '0') {
a[i] = n1[i]-'0';
} else a[i] = (n1[i]-'a'+10);
maxa = max(maxa, a[i]);
}
for(int i=0; i<l2; i++) {
if(n2[i] <= '9' && n2[i] >= '0') {
b[i] = n2[i]-'0';
} else b[i] = (n2[i]-'a'+10);
maxb = max(maxb, b[i]);
}
ll num = 0;
if(tag == 1) {
for(int i=0; i<l1; i++) {
num *= r;
num += a[i];
}
if(num == 0 && n2=="0") {
cout<<"2";
return 0;
}
int lb = max(num, maxb+1);
for(int i=maxb+1; i<=lb; i++) {
ll tmp = 0;
for(int j=0; j<l2; j++) {
tmp *= i;
tmp += b[j];
}
// cout << num << ":" << tmp << endl;
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num) break;
}
cout << "Impossible" << endl;
} else {
for(int i=0; i<l2; i++) {
num *= r;
num += b[i];
}
if(num == 0 && n1=="0") {
cout<<"2";
return 0;
}
int lb = max(num, maxa+1);
for(int i=maxa+1; i<=lb; i++) {
ll tmp = 0;
for(int j=0; j<l1; j++) {
tmp *= i;
tmp += a[j];
}
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num) break;
}
cout << "Impossible" << endl;
}
return 0;
}
本文探讨了基数转换算法在不同进制数之间的转换,并利用二分查找优化搜索过程,解决特定条件下的数值匹配问题。文章详细介绍了如何将字符串表示的数转换为特定进制的数值,以及如何在可能的进制范围内使用二分查找找到正确的进制,使得两个数在不同进制下相等。此外,还讨论了避免变量名冲突和防止死循环的重要性。
1085

被折叠的 条评论
为什么被折叠?



