1010 Radix (25 分)
题目链接
题目思路
二分法+进制转换
核心的点有以下几个:
1.上下界的确定:上界是给定进制的那个数的十进制值,下界是未给定进制的数中最大字符的值加一
2.溢出的问题:尽管我们采用long long,但是仍然可能溢出,所以我们要做好特判防止错解。
3.二分法的模板结构
代码实现
#include<bits/stdc++.h>
using namespace std;
long long trans(string s, long long radix){
int len = s.size();
long long tot = 0, r = 1;
for(int i = len - 1; i >= 0; -- i){
if(isdigit(s[i])) tot += r * (s[i] - '0');
else tot += r * (s[i] - 'a' + 10);
r = r * radix;
}
return tot;
}
int main(){
string a, b, temp;
long long tag, rad, num;
cin>> a>> b;
scanf("%lld%lld", &tag, &rad);
if(tag == 1) num = trans(a, rad), temp = b;
else num = trans(b, rad), temp = a;
char tp = *max_element(temp.begin(), temp.end());
long long low = (isdigit(tp) ? tp - '0' : tp - 'a' + 10) + 1;
long long high = max(num, low);
long long Radix = -1;
while(low <= high){
long long mid = (low + high) / 2;
long long ans = trans(temp, mid);
if(ans < 0 || ans > num) high = mid - 1;
else if(ans == num){
Radix = mid;
high = mid - 1;
}
else low = mid + 1;
}
if(Radix != -1) printf("%lld", Radix);
else puts("Impossible");
return 0;
}
学习柳诺
观摩一番大神的代码,有以下几点可以学习:
- 一个string中最大字符
string s;
char tp = *max_element(s.begin(), s.end());
- 三目运算符和单目运算符的使用——简化代码长度
代码附在下面:
#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n, long long radix) {
long long sum = 0;
int index = 0, temp = 0;
for (auto it = n.rbegin(); it != n.rend(); it++) {
temp = isdigit(*it) ? *it - '0' : *it - 'a' + 10;
sum += temp * pow(radix, index++);
}
return sum;
}
long long find_radix(string n, long long num) {
char it = *max_element(n.begin(), n.end());
long long low = (isdigit(it) ? it - '0': it - 'a' + 10) + 1;
long long high = max(num, low);
while (low <= high) {
long long mid = (low + high) / 2;
long long t = convert(n, mid);
if (t < 0 || t > num) high = mid - 1;
else if (t == num) return mid;
else low = mid + 1;
}
return -1;
}
int main() {
string n1, n2;
long long tag = 0, radix = 0, result_radix;
cin >> n1 >> n2 >> tag >> radix;
result_radix = tag == 1 ? find_radix(n2, convert(n1, radix)) : find_radix(n1, convert(n2, radix));
if (result_radix != -1) {
printf("%lld", result_radix);
} else {
printf("Impossible");
}
return 0;
}