前言
【算法趣题】是来自图灵程序设计丛书绝云译的《程序员的算法趣题》,书中是用Ruby实现的。这里是用python来实现。
问题描述
把年月日表示为YYYYMMDD这样的8位整数,然后把这个整数转换成二进制数并且逆序排列,再把得到的二进制转换成十进制数,求与原日期一致的日期。求得的日期要在上一次东京奥运会(1964年10月10日)到下一次东京奥运会(预定举办日期为2020年7月24日)之间。
例日期为1966年7月13日时:
1.YYYYMMDD格式-->19660713
2.转换成二进制-->1001010111111111110101001
3.逆序排序-->1001010111111111110101001
4.把逆序排列得到的二进制转换成十进制数-->19660713(回到最初的日期1966年7月13日)
思路
十进制数转二进制数,二进制数逆序排列后得到新的二进制数,新的二进制数转换成十进制数等于原来的数。说明转换后的二进制数就是Q01中的回文数。
重点在于时间的遍历,python中要活用datetime这个模块。
python3实现
is_bin_huiwen(n)函数中的n是日期的8位整数,将十进制数转换为二进制数,如果二进制数是个回文数,则返回True,否则返回False。
def is_bin_huiwen(n):
s = str(bin(n))[2:]
if s == s[::-1]:
return True
return False
import datetime
def tran_date(begin, end, delta):
d = begin
while d < end:
n = int(d.strftime("%Y%m%d"))
if is_bin_huiwen(n):
print(n)
d = d + delta
begin = datetime.date(1964,10,10)
end = datetime.date(2020,7,24)
delta = datetime.timedelta(days = 1) # 时间差
tran_date(begin, end, delta)