先说个通知,给参与了码上行动的同学:又一期展示学习成果的编程擂台活动开始了,即是练手的好机会,又能得到助教的全程支持,还可以得积分赢奖金。赶紧来报名吧!从课程首页进入活动或联系答疑群内助教参与。(可点击文末 阅读原文)
之前的两届战况:
只学2个月编程能写出什么代码?他们表示:You can you code!
【编程擂台】第2季 - 又一批码上行动学员作品新鲜出炉(附学习感言)
今天要出的题目源自安全界大牛余弦的一篇文章:我是如何 Python 一句话校验软件哈希值的。@褚瑞 同学也在群里推荐了这个题目。
我们经常看到软件的下载页面会注明这个软件的哈希值。可能你从没在意,但这其实是个蛮重要的东西,它可以用来验证你下载的软件是否被人动过手脚。
Python 下载页面上标出的 MD5 Sum
早些时候 Mac 上爆出的 XCodeGhost 木马事件,引发的一个重要环节就是因为部分开发人员既没有从官方渠道下载,又没有验证软件哈希值,以至于使用了被植入代码的开发工具。
那么问题来了:
请用 Python 写一个小程序,用来计算指定文件的哈希值。
附加题:
可以指定哈希加密算法,并让程序尽可能简单易用。
虽然 Linux 和 Unix 有现成的验证哈希命令,Windows 也有类似软件。不过既然是练习嘛,自己做一遍,会让你对相关的概念有更清楚的认识。
期待各位同学提交解答。
提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。
【解答】验证哥德巴赫猜想
这道题要实现功能并不难。如果你以前写过判断质数的代码,那只要在其基础上多加一层循环,判断相加的两个数是否都是质数即可。
一个参考解答:
# -*- coding: utf-8 -*- import math def goldbach(num): # 断言 num 为偶数并且大于 2 assert num % 2 == 0 and num > 2, 'num 应为偶数' # 仅找出一组数据 for i in range(2, num): # 满足两数之和为 num 并且都为质数 if is_prime(i) and is_prime(num-i): print('{0} 可由两个素数:{1} 和 {2} 组成'.format(num, i, num-i)) break def is_prime(num): # 判断 2 的倍数 if num == 2: return True elif num % 2 == 0: return False # 判断 3 到 sqrt(num) + 1 的奇数 sqrt_num = int(math.sqrt(num)) for i in range(3, sqrt_num+1, 2): if num % i == 0: return False return True goldbach(12345678)
输出:
12345678 可由两个素数 31 和 12345647 组成
附上两份同学提交的解答:
@张贺
遍历2以上N的平方根以下的每一个整数或奇数,是不是能整除N,并比较了两种方法耗时。
http://paste.ubuntu.com/24666659/
@徐大龙
遍历2以上N的平方根以下的每一个整数,是不是能整除N,写法简单易懂。
https://github.com/PeytonXu/learn-python/blob/master/cases/gold_bach/gold_bach.py
『码上行动』在线学习班正在开放中,详情请回复 码上行动 查看
近期文章推荐阅读:
只学2个月编程能写出什么代码?他们表示:You can you code!