您的位置:首页 > 编程语言 > C语言/C++

1010. Radix (25)

2016-01-20 10:50 351 查看
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>

using namespace std;

#define INF (~(1<<31))

typedef long long ll;

inline int char2num(char c){
if(c >= '0' && c <= '9') return c - '0';
else return c - 'a' + 10;
}

ll str2num(string s, ll radix){
ll sum = 0;

for(int i = 0; i < s.size(); ++i){
sum *= radix;
sum += char2num(s[i]);
}

return sum;
}

int cmp(string s, ll radix, ll target){
ll sum = 0;

for(int i = 0; i < s.size(); ++i){
sum *= radix;
sum += char2num(s[i]);

if(sum > target) return 1;
}

if(sum < target) return -1;
else return 0;
}

int main(){
string s1, s2;
ll tag, radix;
cin >> s1 >> s2 >> tag >> radix;

if(tag == 2){
swap(s1, s2);
}

const ll target = str2num(s1, radix);

ll maxNum = -INF;
for(int i = 0; i < s2.size(); ++i){
int num = char2num(s2[i]);
if(num > maxNum){
maxNum = num;
}
}

ll low = maxNum+1, high = target+1, r = -1, mid = low;
while(low <= high){
int ret = cmp(s2, mid, target);

if(ret < 0){
low = mid + 1;
}else if(ret > 0){
high = mid - 1;
}else{
r = mid;
break;
}

mid = low + (high-low)/2;
}

if(r == -1){
printf("Impossible");
}else{
printf("%d", r);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ PAT 1010. Radix 25