【算法趣题】Q07 日期的二进制转换

浏览: 1515

前言

【算法趣题】是来自图灵程序设计丛书绝云译的《程序员的算法趣题》,书中是用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)

image.png

推荐 0
本文由 _缘君_ 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册