PAT 1010 Radix (二分)
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 (二分)的更多相关文章
- PAT 1010 Radix(X)
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = ...
- 已经菜到不行了 PAT 1010. Radix (25)
https://www.patest.cn/contests/pat-a-practise/1010 题目大意: 输入四个数字,a,b,c,d. a和b是两个数字,c=1表示是第一个数字,c=2表示是 ...
- PAT 1010 Radix 进制转换+二分法
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- PAT 1010 Radix (25分) radix取值无限制,二分法提高效率
题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...
- 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 ...
- PAT甲组 1010 Radix (二分)
1010 Radix (25分) Given a pair of positive integers, for example, \(6\) and \(110\), can this equatio ...
- PAT 解题报告 1010. Radix (25)
1010. Radix (25) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 11 ...
- PAT甲级1010. Radix
PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...
- PAT Radix[二分][进制转换][难]
1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...
随机推荐
- centos添加用户并赋予 root管理员权限
centos添加用户并赋予 root管理员权限 用centos时,root用户一般都是超级管理员使用的,一般不轻易给别人,但是有时候同事安装软件时需要root账号,又不得不给,只能重新建一个用户,并 ...
- Web测试控件测试点总结
1. https://www.testwo.com/blog/344 文本输入框测试用例 验证输入框是否trim处理 注:trim()函数作用是 去掉字符序列左边和右边的空格,中间的空格不管.如果字 ...
- 2019牛客竞赛第六场D Move 宏观单调,部分不单调
Move 题意 有k个体积相同的箱子,有个憨憨有固定的装箱策略,每次都只装可以装的重量中最大的东西,求箱子的最小提及 分析 看起来可以二分,但由于他的装箱策略有点蠢,所以只在宏观上满足单调性,在特别小 ...
- EF简单增删改查
第一步:创建上下文对象 using(var db = new Entities()) { //数据操作 } 新增 UserInfo user = new UserInfo() { UserName = ...
- [NLP]Transformer-XL论文解读
关于Transformer的具体内容,可以访问:https://www.cnblogs.com/mj-selina/p/12369797.html 简介 Transformer是Google Brai ...
- C语言 puts
C语言 puts #include <stdio.h> int puts(const char *s); 功能:标准设备输出s字符串,在输出完成后自动输出一个'\n'. 参数: s:字符串 ...
- RTMP 协议规范(中文版)
本文是为截至发稿时止最新 Adobe 官方公布的 RTMP 规范.本文包含 RTMP 规范的全部内容.是第一个比较全面的 RTMP 规范的中译本.由于成文时间仓促,加上作者知识面所限,翻译错误之处在所 ...
- 《E=MC2或一个思想的故事》
思想是起点.一切行动都以萌芽状态孕藏在思想之中,以往所做过的一切均离不开思想. 他是个纯朴的人,喜欢在乡下静静地冥想. .而科学家们却非常清楚,那些最伟大的成就都是在静默中完成的.
- DB技能数据库里把技能伤害调整
1. MagID 技能代号 2. MagName 技能名称 3. Effect Type 效果类型(使用技能时角色的动作效果) 4. Effect 效果(技能产生的动画效果) 5. Spell 每次耗 ...
- Vue - 动态组件 & 异步组件
动态组件 <div id="app"> <components :is="com[2]"></components> < ...