反序相等

反序相等_牛客网

设N是一个四位数,它的9倍恰好是其反序数(例如:1234 的反序数是4321),求N的值。

前言

自己在牛客网在线测试的第一题,虽然很简单,但是做完之后还是被这道题的多重解法和思路给惊艳到了

常规思路

做这种题的第一反应肯定是暴力无误了,将这个四位数拆分成四个一位数字,需要注意的是首位和末尾肯定不能取0。转换成代码就是四层循环,如果符合条件则输出。这是最容易想到的方法,思考时间最快,但是代码肯定运行较慢。

for a in range(1, 10):
    for b in range(0, 10)
        for c in range(0, 10):
            for d in range(1, 10):
                if (a*1000+a*100+b*10+c)*9 == d*1000+c*100+b*10+a:
                    print(a*1000+a*100+b*10+c)

进一步思考

先从千位开始,如果是9倍的话,因为不能取0,所以说从1开始。1的9倍是9,2的9倍是18,这会造成位数溢出,所以说显而易见千位上的数只能是1,那么个位上的数就只能是9了。

for a in range(0, 10):
    for b in range(0, 10):
        if (1009+a*100+b*10)*9 == 9001+b*100+a*10:
            print(1009+a*100+b*10)

注意到上面的if语句中的判断内容还能优化

for a in range(0, 10):
    for b in range(0, 10):
        if not a*89-b+8:
            print(1009+a*100+b*10)

细细一想

再仔细观察一下上面if语句中的表达式,很容易发现由于a乘上了89变成了一个很大的数,那么a必不可能取大于等于1的数,那a只能取0了,与此同时b只能取8了。那答案不就直接出来了…………

print(1089)