16分代码
//1010. Radix(基数、根植、计数根)(25)
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main() {
char N1[12], N2[12];
long long int tag, radix;
long long bcd1 = 0, bcd2 = 0;
cin >> N1;
getchar();
cin>> N2;
getchar();
cin >> tag >> radix;
int len1 = strlen(N1);
int len2 = strlen(N2);
if (tag == 2)
swap(N1, N2);
for (int i = len1 - 1; i >= 0; i--) {
if (N1[i] <= 57)
bcd1 += (N1[i] - '0') * pow(radix, len1 - i - 1);
else if (N1[i] >= 97)
bcd1 += (N1[i] - 'a' + 10) * pow(radix, len1 - i - 1);
}
char max = '0';
int maxx;
for (int i = 0; i < len2; i++) {
if (N2[i] > max)
max = N2[i];
}
if (max <= 57)
maxx = max - '0';
else if (max >= 97)
maxx = max - 'a' + 10;
for(int i=maxx+1; i < bcd1;i++){
for (int j = len2 - 1; j >= 0; j--) {
if (N2[j] <= 57)
bcd2 += (N2[j] - '0') * pow(i, len2 - j - 1);
else if (N2[j] >= 97)
bcd2 += (N2[j] -'a' + 10) * pow(i, len2 - j - 1);
}
if (bcd2 == bcd1) {
cout << i << endl;
break;
}
else if (bcd2 > bcd1) {
cout << "Impossible" << endl;
break;
}
bcd2 = 0;
}
if (bcd2 < bcd1)
cout <<"Impossible" << endl;
return 0;
}
25分代码
//1010. Radix(基数、根植、计数根)(25)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
char n1[20], n2[20];
int t, r;
long long tmp;
int result(long long*a, long long k, long long target, int len) {
long long val2 = 0;
for (int i = 0; i<len; i++)
val2 = val2*k + a[i];
if (val2<0 || val2>target)
return 1;
if (val2<target)
return -1;
if (val2 == target)
return 0;
}
//二分搜索进制k
long long binarySearch(long long *a, long long low, long long high, long long target, int len) {
long long l = low, r = high;
long long mid;
while (l <= r) {
mid = (l + r) / 2;
if (result(a, mid, target, len) == 0)
return mid;
if (result(a, mid, target, len)<0) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return -1; //impossible
}
long long int Cal(char c)
{
if (c >= '0' && c <= '9')
{
return (c - '0');
}
else
return (c - 'a' + 10);
}
int main()
{
cin >> n1 >> n2 >> t >> r;
if (t == 2) {
swap(n1, n2);
}
char num[20];
strcpy(num, n1);
int len = strlen(num);
long long val1 = 0; //转化成十进制
for (int i = 0; i<len; i++) {
val1 = val1*r + Cal(num[i]);
}
strcpy(num, n2);
len = strlen(num);
long long low = 0;
long long a[20];
for (int i = 0; i<len; i++) {
tmp = Cal(num[i]);
a[i] = tmp;
if (tmp>low)
low = tmp;
}
low = low + 1;
long long high = max(low, val1) + 1;
long long ans = binarySearch(a, low, high, val1, len);
if (ans == -1)
cout << "Impossible" << endl;
else
cout << ans << endl;
return 0;
}