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.

思路

输出可以使得N1=N2的最小进制。

因为此题的进制上限是正无穷,因此考虑使用二分法来挑选最佳进制。因此,问题可以转化为如何选择进制的最大值与最小值。

小技巧

​ ①如果flag=2,那么swap(a,b )

​ ②用string来存字符串,统一将字符转换为对应的整数,方便运算,见代码中的init()函数(如果用char[]来存,就不能这么操作了,因为'0'-'0' = '\0',strlen函数会出问题)。

这个题有比较坑的地方

​ ①long long类型有可能溢出。这就造成了如果N1的范围大于了long long的范围,有可能会编程负数。我看一些博客中,简单的加了一个判断条件N2 < 0。但是面对一个超范围的数字,应该不能简单的判断N1与N2的大小(例如N2 = -1,但有可能是LLONG_MAX + LLONG_MAX + 1;而N1 = 8,但有可能是LLONG_MAX + LLONG_MAX + 9,这个时候通过N2<0,来作为N2>N1的判断条件是不对的)。好在这题的数据没有考虑的这个问题。

​ ②一定要注意进制的最大值是无穷,而不是35。但是最大值是可以确定的。设N1对应的十进制为num,那么N2的最大进制不超过num。因为N2越小,最佳进制就要越大。N2的最小值为1(最佳进制下;0的话num一定也满足),那么num就已经足够了。另外要保证最大进制大于最小进制,因此代码中有个max操作。

代码

#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <map>
#include <limits.h>
using namespace std;
string a, b;
long long flag, radex;
long long minn = INT_MIN, maxx = INT_MIN; long long to10(string s, long long radex){
long long p = 1;
long long sum = 0;
for(int i = s.length() - 1; i >= 0; i--){
sum = sum + p * s[i];
p *= radex;
}
return sum;
} void prove(long long dec){
while(minn <= maxx){
long long mid = (minn + maxx) >> 1;
long long num = to10(b, mid);
if(num < 0 || num > dec){
maxx = mid - 1;
}
else if(num == dec){
cout << mid;
return;
}
else{
minn = mid + 1;
}
}
cout << "Impossible";
} void init(){
for(int i = 0; i < a.length(); i++){
if(isdigit(a[i])) a[i] = a[i] - '0';
else a[i] = a[i] - 'a' + 10;
}
for(int i = 0; i < b.length(); i++){
if(isdigit(b[i])) b[i] = b[i] - '0';
else b[i] = b[i] - 'a' + 10;
}
} int main() {
cin >> a >> b >> flag >> radex;
if(flag == 2) swap(a, b);
init();
minn = *max_element(b.begin(), b.begin()) + 1;
long long dec = to10(a, radex);
maxx = max(dec, minn);
prove(dec); return 0;
}

PAT 1010 Radix (二分)的更多相关文章

  1. PAT 1010 Radix(X)

    1010 Radix (25 分)   Given a pair of positive integers, for example, 6 and 110, can this equation 6 = ...

  2. 已经菜到不行了 PAT 1010. Radix (25)

    https://www.patest.cn/contests/pat-a-practise/1010 题目大意: 输入四个数字,a,b,c,d. a和b是两个数字,c=1表示是第一个数字,c=2表示是 ...

  3. PAT 1010 Radix 进制转换+二分法

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  4. PAT 1010 Radix (25分) radix取值无限制,二分法提高效率

    题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...

  5. PAT 甲级 1010 Radix (25)(25 分)进制匹配(听说要用二分,历经坎坷,终于AC)

    1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...

  6. PAT甲组 1010 Radix (二分)

    1010 Radix (25分) Given a pair of positive integers, for example, \(6\) and \(110\), can this equatio ...

  7. PAT 解题报告 1010. Radix (25)

    1010. Radix (25) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 11 ...

  8. PAT甲级1010. Radix

    PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...

  9. PAT Radix[二分][进制转换][难]

    1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...

随机推荐

  1. bash数学运算之bc

    一.expr 1.1 语法 注意必须有空格 只能精确到整数,无法精确到浮点数 1.2 操作符对照表 使用expr命令时需要加\进行转义,因为部分符号是保留关键字 例1:比较num1跟num2的大小 [ ...

  2. hrtf 旋转音效matlab实现

    原理参考: http://www.mahong.me/archives/97 将音频分段,各个段分别使用hrtf在Ls, L, R, Ls, Rrs, Lrs位置处的filter系数.是声音听起来来自 ...

  3. PP: Pattern Trails: visual analysis of pattern transitions in subspaces

    Problem: 1. We can't find patterns in full attribute space, and patterns may only be found in smalle ...

  4. PP: Composite visual mapping for time series visualization

    However: The conventional visual mapping maps each data attribute onto a single visual channel Purpo ...

  5. (转)eclipse调试java程序的九个技巧

    转自:http://www.cnblogs.com/lingiu/p/3802391.html 九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions ...

  6. 创建一个Java Web项目,获取POST数据并显示

    新建一个新的Java Web工程项目 打开IntelliJ IDEA 新建一个工程,选择选择Java Enterprise,设置Tomcat的安装目录,点击下一步. 选中Create project ...

  7. TWF

    design seq1_b3 sta_label 0.0-1.0 0.0-1.0 1e-9 # clocks# clockID clock_name period rise_edge fall_edg ...

  8. tomcat8.5和redis实现session共享

    1. 问题 ​ 由于之前看其他资料配置的session共享没注意自己tomcat的版本所以出现了诸多问题,tomcat8.5和之前版本的配置是不一样的. 2. 配置 ​ ①将如图所示三个jar包放入t ...

  9. python之路之面向对象3

    一.知识点拾遗 1.多继承的易错点 二.设计模式 1.设计模式介绍 Gof设计模式 大话设计模式 2.单例模式 当所有实例中封装的数据相同时,使用单例模式 静态方法+静态字段 单例就是只有一个实例 a ...

  10. Strategic game(无向?)二分图最小点覆盖(Poj1463,Uva1292)

    原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #incl ...