博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
甲级PAT 1010 Radix (25 分)(考虑溢出)
阅读量:3897 次
发布时间:2019-05-23

本文共 1414 字,大约阅读时间需要 4 分钟。

【题意】

给定两个数N1,N2(均不超过10位),和一个tag(1或2)和radix(表示几进制),要求判断当数N_{tag}是一个radix进制数时,是否存在一种进制使得另一个数等于这个数成立。

【题解】

一开始我们很容易会以为进制数只可能在【2,36】,所以可能会枚举或者二分,但是只会有部分正确,为什么呢?

因为更大的进制数也有可能。虽然无法被全部表达,但是根据我们的N1或者N2和一个确定的更大的进制数是很容易得到他表达的值的。然后我们考虑选择二分和二分的范围,最小值肯定会>=2,但是同时也要大于给定的进制数中的最大值,比如'1a',那么进制数最小肯定是11;最大值是多少呢?题目说给定的数据不会超过十位,所以我们把最大值定为1e11即可。题目要求有多种答案时,输出最小的一个,所以我们在二分得到计算结果等于N_{tag}所表示的数时,还要缩小右端点r,继续判断。

坑点:计算时可能会炸longlong,为了避免溢出带来的干扰,我们在二分得到计算结果为负数时,也选择缩小取值范围。

【代码】

#include 
using namespace std;#define ll long longll ans=-1;ll cul(string s,ll x){ ll ret=0; for(int i=0;s[i];i++) ret=ret*x+((s[i]>='0'&&s[i]<='9')?s[i]-'0':s[i]-'a'+10); return ret;}void solve(string s,ll a,ll mi){ ll l=mi,r=(ll)1e12; while(l<=r){ ll mid=(l+r)/2; ll x=cul(s,mid); if(x==a){ ans=mid; r=mid-1; } else if(x>a||x<0) r=mid-1; else l=mid+1; }}ll getmi(string a){ ll aa=2; for(int i=0;a[i];i++) if(a[i]>='0'&&a[i]<='9') aa=max(aa,(ll)a[i]-'0'+1); else aa=max(aa,(ll)a[i]-'a'+11); return aa;}int main(){ string a,b; ll tag,rad; cin>>a>>b>>tag>>rad; int aa=getmi(a),bb=getmi(b); ll x; int f=1; if(tag==1){ if(aa>rad) f=0; x=cul(a,rad); solve(b,x,bb); } else{ if(bb>rad) f=0; x=cul(b,rad); solve(a,x,aa); } if(f&&ans!=-1) printf("%lld\n",ans); else printf("Impossible\n"); return 0;}

 

转载地址:http://qhfen.baihongyu.com/

你可能感兴趣的文章
CentOS7 安装配置FastDFS
查看>>
递归算法的时间复杂度
查看>>
数据结构之图(存储结构、遍历)
查看>>
使用sizeof计算类的大小
查看>>
乐观锁与悲观锁——解决并发问题
查看>>
operator 类型转换及重载
查看>>
HTTP状态码
查看>>
TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系
查看>>
TCP/IP详解--再次深入理解TCP网络编程中的send和recv
查看>>
TCP与UDP收发的时候TCP有缓冲区还是UDP有缓冲区,使用它们时该注意什么?
查看>>
C++中map、hash_map、unordered_map、unordered_set通俗辨析
查看>>
clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结
查看>>
运算符重载参数的顺序对运算是否有影响
查看>>
什么时候要用虚析构函数?
查看>>
序列化、反序列化与jsoncpp学习
查看>>
同步/异步与阻塞非阻塞的关系
查看>>
epoll模型讲解/源码分析
查看>>
ELF格式与bss段
查看>>
java继承 long和float小记点
查看>>
记录几点在开发中遇到的问题 2015-7-28 (会更新)
查看>>