PAT1010

http://pat.zju.edu.cn/contests/pat-a-practise/1010

这是PAT通过率最低的一道题,只有0.07。就是给出2个数字,以及其中一个数字的基数,问在什么基数下,另一个数能够与之相等。


直接想法是将其中一个数字转化为计算机内部表示的数值,然后不断尝试另一个数字的基数,但是这样会不会超过 long long的表示范围呢?

题目中说给出的数字不超过10位,对基数(radix)没有限制,因此数值可能是无限大,应当用大数做,但是如果真的这样做,就被坑了。因为数据比较弱,人家long long就能过,你还在写大数,时间来不及。

所以此题应当补充一个条件,待比较数n在long long 范围内。一旦有此条件,我们可以推断,基数r也一定在long long 范围内,所以可以定义为long long,因为如果S只有1位,r最多也就36,如果S大于1位,r不会超过待比较数n。

1,将其中一个数转化为long long,待比较,记为n,目标数的字符串记为S,其基数为r;

2,估算基数r下界;

基数合法的下界应该是min(2,S中最大位+1),我在估算下界时wa了几次,一次是直接把2作为下界了,一次是S中最大位没有加1。

3,估算基数r上界;

在S至少有2位的情况下,目标数一定大于等于基数,因此基数大于待比较数n就没有意义了,此时上界是n。如果只有1位,单独处理。

4,二分法查找基数;

超时了一次就是因为没用二分法。因为数值和基数之间是正相关的,所以可以利用这个性质。每次比较返回一个结果,大于还是小于,当计算目标数为负,可以知道越界了,那么一定大于待比较数n,这点我没注意得了个wa。

5,当字符串只有1位时可能有多个答案,取最小,需要单独处理。

我又得了个wa,此时只要计算当r比较S所表示的数+1时的目标值就行了。


一共5个地方没注意,本人通过率为17%。

你可能感兴趣的:(PAT)