给出两个数值X和Y,返回在这个区间里的回文数,并且要求它们的平方根也是回文数。
例如(X=1,Y=10000):
[(1, 1), (2, 4), (3, 9), (11, 121), (22, 484), (101, 10201), (111, 12321), (121, 14641), (202, 40804), (212, 44944)]
代码一:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def isPalindrome(n): s = str(n) return s == s[::-1] def main(): m1 = 1 m2 = 10000000 return [(i, i*i) for i in range(m1,m2) if isPalindrome(i) and isPalindrome(i*i)] if __name__ == '__main__': import time st = time.time() print(main(), time.time() - st, sep='\n')
代码二:算法有进步,速度没改进
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def isPalindrome(n): s = str(n) return s == s[::-1] def filterNum(n): s = str(n) if int(s[-1]) not in {1,2,3}: return False else: return s == s[::-1] def main(n): return [(i, i*i) for i in range(1,n) if filterNum(i) and isPalindrome(i*i)] if __name__ == '__main__': import time st = time.time() print(main(10000000), time.time()-st, sep='\n')
代码三:这个速度最快
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from time import time def filterNum(n): s = str(n) return s == s[::-1] if s[-1] in '123' else False def main(n): isPalindrome = lambda n: str(n) == str(n)[::-1] return [(i, i*i) for i in range(1,n) if filterNum(i) and isPalindrome(i*i)] if __name__ == '__main__': st = time() print(main(10000000), time()-st, sep='\n')