我是靠谱客的博主 聪明绿草,最近开发中收集的这篇文章主要介绍PATA 1010 Radix(进制转换),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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(进制转换)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部