PAT甲级真题1010 进制

简介: PAT甲级真题1010 进制

PAT甲级真题1010 进制

链接:PAT甲级真题1010 进制

给定一对正整数,例如 6 和 110,此等式 6=110 是否成立?

答案是可以成立,当 6 是十进制数字,110 是二进制数字时等式得到满足。

现在,给定一个正整数数对 N1,N2,并给出其中一个数字的进制,请你求出另一个数字在什么进制下,两数相等成立。

输入格式

输入共一行,包含四个正整数,格式如下:

N1 N2 tag radix

N1 和 N2 是两个不超过 10 位的数字,radix 是其中一个数字的进制,如果 tag 为 1,则 radix 是 N1 的进制,如果 tag 为 2,则 radix 是 N2 的进制。

注意,一个数字的各个位上的数都不会超过它的进制,我们用 0∼9 表示数字 0∼9,用 a∼z 表示 10∼35。

输出格式

输出使得 N1=N2 成立的另一个数字的进制数。

如果等式不可能成立,则输出 Impossible。

如果答案不唯一,则输出更小的进制数。

数据范围

2≤radix≤36

输入样例1:

6 110 1 10

输出样例1:

2

输入样例2:

1 ab 1 2

输出样例2:

Impossible

解题思路

枚举区间很大时,我们会想可不可以用二分求?

当进制变大时数值也一定是变大的,所以这是个单调的过程可以用二分

  1. 二分的分析:
  1. 二分的区间
  • 左端点:N2数字里最大的那位加1
  • 右端点:target + 1
  1. 使用哪个模板?
知识点:秦九韶算法

LL cal(string str, LL r) {
    LL res = 0;
    for (auto c : str)
    {
        if ((double)res * r + get(c) > 1e16) return 1e18;
        res = res * r + get(c);
    }
    return res;
} 

注意判断一下,如果在算最高位时直接大于3610(3∗1015)也就是最大进制,那准定是无解的,直接返回一个更大的比如1e18作为右边界就行。

易错点
  • 进制位r也的是long long 类型的
  • 二分条件想错了:应该是找大于等于target的最小进制数 if(cal(s2, r)) >= target
  • 关于二分的左右边界,还是得正常去找。左边界就是每位数中最大的数加一,右边界就是3610,(3∗1015),如果在算最高位时直接大于36^10也就是最大进制,那准定是无解的,直接返回一个更大的比如1e18作为右边界就行。

AC代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL getn(char i){
    if(i<='9')return i - '0';
    else return 10 + (i - 'a');
}
//转换为10进制
LL cal_10(string n,LL r){
    LL res=0;
    for(auto e : n){
        if((double)res*r+getn(e)>1e16) return 1e18;
        res = res*r + getn(e); 
    }
    return res;
}
int main()
{
    string N1 ,N2;
    LL radix,tag;
    cin >> N1 >> N2 >> tag >> radix;
    if(tag==2)swap(N1,N2);
    LL target = cal_10(N1,radix);//把N1转换为10进制
    LL l = 0,r = target+1;
    for(auto i : N2)l=max(l,(LL)getn(i)+1);
    //二分判断
    while(l<r){
        LL mid = l+r>>1;
        if(cal_10(N2,mid)>=target)r=mid;
        else l=mid+1;
    }
    if(cal_10(N2,r)!=target)cout<<"Impossible"<<endl;
    else cout << r <<endl;
    return 0;
}


相关文章
|
运维 Kubernetes API
k8s开启临时容ephemeral器进行debug调试
k8s开启临时容ephemeral器进行debug调试
|
开发工具 git
Gitlab/GitHub:迁移代码,并保留历史记录
Gitlab/GitHub:迁移代码,并保留历史记录
Gitlab/GitHub:迁移代码,并保留历史记录
|
人工智能 自然语言处理 文字识别
《鸿蒙系统中AI技术集成与应用:高效开发之道》
在科技飞速发展的今天,鸿蒙系统与人工智能的融合为开发者带来新机遇。鸿蒙内置AI服务如语音助手、视觉识别等,可直接调用;DevEcoStudio和DevEcoCodeGenie等智能工具简化代码生成;500多款适配鸿蒙的AI类SDK覆盖多场景,降低开发成本;低代码平台助力快速构建应用;参与鸿蒙社区和开源项目,共享经验与资源。这些优势帮助开发者打造更智能的应用,推动鸿蒙生态繁荣。
640 4
|
存储 监控 安全
实时记录和查看Apache 日志
Apache 是一个开源、跨平台的Web服务器,保护其安全依赖于监控活动和分析访问日志。日志分为访问日志和错误日志,前者记录用户请求及响应情况,后者记录服务器错误信息。EventLog Analyzer等工具可集中收集、分析日志,提供直观的仪表板和实时警报,帮助识别趋势、异常和威胁,确保服务器稳定性和安全性,并支持合规管理。
340 5
|
存储 NoSQL API
【小小思考】Redis实现去重任务队列
【2月更文挑战第1天】思考一下如何用Redis实现去重的任务队列,主要有List 、List + Set/Hash/Bloom Filter、ZSet、Lua和开源库等方式。
678 1
|
前端开发 JavaScript
在 Vue3 + ElementPlus 项目中使用 computed 实现前端静态分页
本文介绍了在Vue3 + ElementPlus项目中使用`computed`属性实现前端静态分页的方法,并提供了详细的示例代码和运行效果。
675 1
在 Vue3 + ElementPlus 项目中使用 computed 实现前端静态分页
|
机器学习/深度学习 算法 知识图谱
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
|
存储 Java 关系型数据库
【Kafka+Flume+Mysql+Spark】实现新闻话题实时统计分析系统(附源码)
【Kafka+Flume+Mysql+Spark】实现新闻话题实时统计分析系统(附源码)
520 1
【Kafka+Flume+Mysql+Spark】实现新闻话题实时统计分析系统(附源码)
|
存储 安全 Java
Java一分钟:缓冲流提升读写效率
【5月更文挑战第11天】Java I/O的缓冲流通过内存缓冲区提升读写性能,实现批量处理和预读写。注意避免缓冲区溢出、忘记刷新和关闭以及数据同步问题。示例展示了字节和字符缓冲流在文件复制中的应用,降低磁盘I/O次数,提高效率。熟练掌握缓冲流使用有助于优化Java程序的I/O性能。
449 2
|
JavaScript 前端开发
VUE3v-text、v-html、:style的理解
VUE3v-text、v-html、:style的理解
747 2