A1010 Radix 传送门
这题卡了好几天, 感觉算法笔记给的基础1-6章里,有很多劝退题啊.
历经千辛万苦终于搞对了这题
献上AC代码
#include<bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int MAX = 2e6+7;
string n1,n2;
ll tag,radix;
ll num1;
ll Max = ((ll)1<<63)-1;
ll getNum(char c){
if(c>='0' && c<='9') return c-'0';
else if(c>='a' && c <='z') return c-'a'+10;
else return -1;
}
ll r2d(string str, ll radix){
int len = str.length();
ll ans=0;
for(int i=0; i< len; i++){
ll num = getNum(str[i]);
ans = ans * radix + num;
}
return ans;
}
ll getLeft(string str){
ll Max = 0;
for(int i=0; i<str.length(); i++){
ll num = getNum(str[i]);
if(num > Max) Max = num;
}
return Max+1;
}
void solve(string str){/* 看这里面!!!*/
int flag = 0;
ll left = getLeft(str);
ll right = max(left, num1)+1;
ll mid;
while(left <= right) {
mid = (left + right) / 2;
ll num2 = r2d(str, mid);
if(num2 == num1) {
flag = 1;
break;
} else if(num2 <0 /* 看这里!!!*/|| num2 > num1) {/* 看这里!!!*/
right = mid - 1;
} else {
left = mid + 1;
}
}
if(flag) {
cout << mid;
} else printf("Impossible");
}
int main(void){
FAST;
cin >> n1 >> n2 >> tag >> radix;
if(tag==2) {
string tmp = n1;
n1 = n2;
n2 = tmp;
}
num1 = r2d(n1,radix);
solve(n2);/* 看这个函数里面!!!*/
}
给大家看看我n个15分的代码
#include<bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int MAX = 2e6+7;
string n1,n2;
ll tag,radix;
ll num1;
ll Max = ((ll)1<<63)-1;
ll getNum(char c){
if(c>='0' && c<='9') return c-'0';
else if(c>='a' && c <='z') return c-'a'+10;
else return -1;
}
ll r2d(string str, ll radix){
int len = str.length();
ll ans=0;
for(int i=0; i< len; i++){
ll num = getNum(str[i]);
ans = ans * radix + num;
}
return ans;
}
ll getLeft(string str){
ll Max = 0;
for(int i=0; i<str.length(); i++){
ll num = getNum(str[i]);
if(num > Max) Max = num;
}
return Max+1;
}
void solve(string str){/* 看这里!!!*/
int flag = 0;
ll left = getLeft(str);
ll right = max(left, num1)+1;
ll mid;
while(left <= right) {
mid = (left + right) / 2;
ll num2 = r2d(str, mid);
if(num2 == num1) {
flag = 1;
break;
} else if(/* 看这里!!!*/num2 > num1) { /* 看这里!!!*/
right = mid - 1;
} else {
left = mid + 1;
}
}
if(flag) {
cout << mid;
} else printf("Impossible");
}
int main(void){
FAST;
cin >> n1 >> n2 >> tag >> radix;
if(tag==2) {
string tmp = n1;
n1 = n2;
n2 = tmp;
}
num1 = r2d(n1,radix);
solve(n2);/* 看这里!!!*/
}
有什么区别呢?
关键在于solve 的 二分查找如果ll 溢出 会显示负值, 那么我们也知道这是一个很大数(比longlong)大, 所以查找条件要添加 < 的判断啊,mmp.