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 ...
随机推荐
- 笔记本u盘插上不显示
u盘突然拔出笔记本再次插入时不显示: 解决方法:我的电脑-设备管理器-其他设备(你的U盘驱动)-卸载 再重新插上去,即可显示
- git 报错和解决
1.报错 fatal: refusing to merge unrelated histories 解决 两个不相干的库进行合并,需要进行强制合并 git pull origin master --a ...
- Java EE 7 API
学习Java必备资源,下载链接: https://pan.baidu.com/s/1P1xzuoGJCIuZlYBbPSbM_Q 提取码: dtui 复制这段内容后打开百度网盘手机App,操作更方便哦
- Spring学习(六)
AOP和OOP 1.OOP:Object-Oriented Programming,面向对象程序设计,是静态的,一旦类写死了就不能改变了,要更改就得修改代码重新编译,父类类型引用指向对象来实现动态性. ...
- C语言结构体理解
本质就是数学中集合,里面变量相当于元素,难点在于就是:以前做数学题都是别人给了一个集合,算里面的关系,编程不一样的就是,自己定义一个集合.
- EF的延迟加载LazyLoad
延迟加载只对 关联/导航 属性(Navigation Property)有用,普通属性没有这个东西. 延迟加载是一条一条的读取属性,调用一次,读取一次. 条件: context.Configurati ...
- java-判断年份是不是闰年
if ((year%4==0)&&(year%100!=0)||(year%400==0)) {//是闰年 leapYear = true; }
- Markdown进阶教程
Markdown是很好用的轻量级标记语言,许多开发人员喜欢使用Markdown来记录学习心得和写博客.本篇博客主要介绍Markdown的高级技巧教程,Markdown的基础教程已经在上篇介绍过了. ...
- MS SQL Server 2014,sa登录失败问题
1.用Windows身份验证登录 2.服务器属性-安全性 3.进入服务,重启所有SQL服务
- Vue - 自定义组件双向绑定
前言 无论在任何的语言或框架中,我们都提倡代码的复用性.对于Vue来说也是如此,相同的代码逻辑会被封装成组件,除了复用之外,更重要的是统一管理提高开发效率.我真就接手过一个项目,多个页面都会用到的列表 ...