概述
1010 Radix
分数 25
作者 CHEN, Yue
单位 浙江大学
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes
, if 6 is a decimal number and 110 is a binary number.
Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.
Input Specification:
Each input file contains one test case. Each case occupies a line which contains 4 positive integers:
N1 N2 tag radix
Here N1
and N2
each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a
-z
} where 0-9 represent the decimal numbers 0-9, and a
-z
represent the decimal numbers 10-35. The last number radix
is the radix of N1
if tag
is 1, or of N2
if tag
is 2.
Output Specification:
For each test case, print in one line the radix of the other number so that the equation N1
= N2
is true. If the equation is impossible, print Impossible
. If the solution is not unique, output the smallest possible radix.
Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible
注意另外一个字符串的进制并不是简单的最大36进制,有可能是无穷进制,这就需要用二分法来求解。并且需要把两外一个字符串的最小进制求解出来,否则会出错(我写了另外一个代码,没有求出最小进制,有一个测试点过不了,现在也没找出原因)。并且转进制所求的数应该开 long long ,int 会爆。
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
//val初值为无穷大,得到第一个十进制数,看stoLL函数就能理解了
LL val = 1e18;
//s radix进制转换为十进制
LL stoLL(string s, LL radix)
{
LL res = 0, index = 1;
for(int i=s.size()-1; i>=0; --i)
{
int v;
if(isdigit(s[i]))
v = s[i] - '0';
else
v = s[i] - 'a' + 10;
res += v * index;
index *= radix;
if(res > val) //如果res大于val,说明radix进制肯定大了
break;
}
return res;
}
int main()
{
string s[3];
LL tag, radix;
cin >> s[1] >> s[2] >> tag >> radix;
val = stoLL(s[tag], radix);
//找到另外一个字符串的最小进制
LL l = 0, r = val + 1;
for(int i=0;i<s[tag ^ 3].size();++i)
{
LL v;
if(isdigit(s[tag ^ 3][i]))
v = s[tag ^ 3][i] - '0';
else
v = s[tag ^ 3][i] - 'a' + 10;
l = max(l,v + 1);
}
//二分
while(l < r)
{
LL mid = l + r >> 1;
if(stoLL(s[tag ^ 3], mid) >= val)
r = mid;
else
l = mid + 1;
}
if(stoLL(s[tag ^ 3], l) == val)
cout << l << endl;
else
puts("Impossible");
return 0;
}
有一个测试点通不过,求大佬找错误:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
LL val = 1e18;
LL stoLL(string s, LL radix)
{
LL res = 0, index = 1;
for(int i=s.size()-1; i>=0; --i)
{
int v;
if(isdigit(s[i]))
v = s[i] - '0';
else
v = s[i] - 'a' + 10;
//如果radix比本身的元素都要小,那么这个进制肯定小了,将答案赋为负值退出
if(v >= radix)
{
res = -1e9;
break;
}
res += v * index;
index *= radix;
if(res > val)
break;
}
return res;
}
int main()
{
string s[3];
LL tag, radix;
cin >> s[1] >> s[2] >> tag >> radix;
val = stoLL(s[tag], radix);
LL l = 0,r = max(val + 1, 36ll);
while(l < r)
{
LL mid = l + r >> 1;
if(stoLL(s[tag ^ 3], mid) >= val)
r = mid;
else
l = mid + 1;
}
if(stoLL(s[tag ^ 3], l) == val)
cout << l << endl;
else
puts("Impossible");
return 0;
}
最后
以上就是聪明绿草为你收集整理的PATA 1010 Radix(进制转换)的全部内容,希望文章能够帮你解决PATA 1010 Radix(进制转换)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复