PAT A1010.Radix

链接: https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536

算法笔记实战指南P167

题意:

给2个数:N和M,给出N的进制,求出M的进制为多少时,才能与N相同,如果不存在这样的进制,给出“Impossible”

N 和 M 都以字符串的形式给出,最多10个digits,从‘0’-‘9’,‘a’-‘z’,代表0-35

注意:

1. 虽然M每位最大是35,但是M的进制可能大于36。

2. M 的进制应该比它的 每一位都大,所以至少是它的所有数位上的最大的数+1,而不是直接以1位L,(这是题目要求)

3. M的进制最大值 = max(M的进制最小值,N的十进制)+1

4. M需要遍历的进制较多,需要二分,将复杂度降到O(log N) ,其中N = M的进制最大值 - M的进制最小值

5. 用上long long , 而且这样也会溢出,因此,转换为十进制后小于N,可能是进制太小,也可能是溢出造成小于0

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std; typedef long long LL; char n[],m[]; int charToInt(char c)
{
if(isdigit(c))
return c-'';
return c-'a'+;
} // 注意:ans 可能会超过LL的范围,溢出,此时返回值小于0
LL toDecimal(LL radix, char a[]){
LL ans = ;
for(int i = ;a[i];i++){
ans = ans * radix + charToInt(a[i]);
}
return ans;
} // 题目要求了进制必须大于每一位数字,这里查找最小的进制
int findMinRadix(char a[]){
int ans = -;
for(int i = ;a[i];i++){
ans = max(ans,charToInt(a[i]));
}
ans++;
return ans;
} LL solve(LL l, LL r, LL x){
LL preJudge = toDecimal(r,m);
// 注意这里也可以不预先判断,但是如果预先判断了,一定要注意小于x不代表真的小,还可能是溢出
if(preJudge>&&preJudge<x)
return -;
LL mid;
while(l<=r){
// 防止 l + r 溢出
mid = l + (r-l)/;
LL y = toDecimal(mid, m);
if(y==x)
return mid;
// 注意判断是否溢出,如果溢出,也代表选择的进制太大
if(y<||y>x)
r = mid-;
else
l = mid+;
}
return -;
} int main(){
int target, radix;
while(scanf("%s%s%d%d",n,m, &target, &radix)!=EOF){
char tmp[];
if(target==){
strcpy(tmp,n);
strcpy(n,m);
strcpy(m,tmp);
}
LL x = toDecimal(radix, n);
LL l = findMinRadix(m);
LL r = max(l, x)+;
LL ans = solve(l,r,x);
if(ans==-)
printf("Impossible\n");
else
printf("%lld\n",ans);
}
return ;
}

PAT A1010.Radix 二分法的更多相关文章

  1. PAT A1010 Radix (25 分)——进制转换,二分法

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

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

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

  3. PAT甲级——A1010 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. A1010. Radix

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

  6. PAT 1010 Radix (二分)

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

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

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

  8. A1010 Radix (25 分)

    一.技术总结 首先得写一个进制转换函数convert(),函数输入参数是字符串str和需要转化的进制(使用long long数据类型).函数内部知识,使用函数迭代器,即auto it = n.rbeg ...

  9. PAT 1010 Radix(X)

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

随机推荐

  1. java面试题复习(一)

    //基础最重要,如果面试官问一个答不上一个,那有难度的都都不用问了,直接就pass了,就像我,嘿嘿. //每天最好熟记10个问题,这些问题在编程是会很厚帮助,帮你避免很多不应该出现的错误. 一.面向对 ...

  2. TIMESTAMP(6)类型的时间差

    TIMESTAMP 数据类型 它包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息. 以分钟为单位查询时间差 select ROUND(TO_NUMBER(to_date(to_c ...

  3. Java_延迟操作

    1. 用Thread就不会iu无法终止     new Thread(new Runnable() {               public void run() {                ...

  4. VS2017编译SNMP++步骤记录

    1.下载地址:https://www.agentpp.com/download.html 三个都下 2.新建解决方案 TestSnmp 3.下载后解压到解决方案文件夹(注意,解压后的 snmp++的版 ...

  5. OSVOS 半监督视频分割入门论文(中文翻译)

    摘要: 本文解决了半监督视频目标分割的问题.给定第一帧的mask,将目标从视频背景中分离出来.本文提出OSVOS,基于FCN框架的,可以连续依次地将在IMAGENET上学到的信息转移到通用语义信息,实 ...

  6. C# 读取TXT文本数据 添加到数据库

    protected void Button1_Click(object sender, EventArgs e) { //使用FileStream读取文件 FileStream fileStream ...

  7. selenium使用技巧

    标签(空格分隔): selenium 我们进行selenium的时候,就是通过webdriver,对浏览器做一些操作的: webdriver,除了find操作,之外还有哪些方法和属性呢? 1.获取当前 ...

  8. j2EE基础知识

    感觉应付面试足够了 一.基本概念 1.1 WEB开发的相关知识 WEB用于表示Internet主机上供外界访问的资源. Intrenet上供外界访问Web资源分为 静态web资源:web页面中供人们浏 ...

  9. jQuery轮播图--不使用插件

    说明:引入jquery.min.js    将轮播图放入imgs文件夹 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  10. grep -iq 与grep -qi 意思

    就是有的时候你不需要直接打印出结果,比如在shell脚本中,你只需要知道grep有没有找到指定的字符串,而不需要满屏幕打印出来,因为那样会很难看.这只可以加-q选项,执行结果是:如果找到了,会返回0, ...