PAT甲级1010TMD的坑

##TMLGB一切皆有可能

内容:
简介:故事要从博主今天中午睡了个午觉说起,博主醒了浑身乏力只能祭出一道PAT题来找回精神,从此踏上一条不归路。。。
废话不多说,祭题。
在这里插入图片描述
题目大概意思:
N1,N2为输入的两个非负整数redix为第tag数的进制数,让我们求最小的redix2使得N1 = N2,比如例子6 110 1 10的答案为2:十进制下的6等于二进制下的110。
先说一下笔者遇到的坑,首先是二分查找。假设N1进制数已知求N2的进制数redix2易知redix2的最小取值为N2所有位上最大值count+1。最大值:(笔者查找了一些博客结合自身理解如有问题请指出)如果N2只有一位有效显然最大值显然没有约束,但如果有两位以上有效那么最大值必然小于等于N1的10进制数NUM1 + 1,为什么呢,因为前提是两位有效,第二位必然大于等于1如果redix2 == NUM1 +1 ,它的10进制数NUM2必然>=NUM1综合上述两种情况得出redix2 = NUM1 + 1 > count + 1? NUM1 + 1 : count + 1;所以这个取值范围可能会很广,暴力测试7过不去。此处重点.
第二个坑:由于笔者是用的double类型所以没有出现其他博客中出现的溢出问题,此处的坑其实是由第一个坑引起的,笔者使用了二分查找但是测试点7还是出现了问题,终于笔者忙乎了一个下午找出了问题所在:redix2的值可能会造成int溢出,因为我们取它的最大可能值为redix2 = NUM1 + 1 > count ? NUM1 + 1 : count;显然在此题中可能会溢出所以我更改为long型存储redix2的最大可能值后测试点7成功通过。
还有一个小坑点就是题目中说了可能不知一个答案且取最小值,明显只有当它为一位数的时候才会出现这种情况,所以我找出redix2的最小之后先测试一下这个最小值是否通过
上图:笔者自己的程序
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值