题目👇
(1)编写程序,判断今天是今年的第几天;
(2)编写程序实现如下功能:循环遍历i从0到4,j从0到4,k从0到4,如果i、j、k都等于3时,输出“it’s over”,结束整个循环;否则打印i、j、k的值。程序开头为:
for i in range(5):
for j in range(5):
for k in range(5):
(3)编写程序实现如下功能:循环遍历i从0到4,j从0到4,k从0到4,打印除i==j==k==3之外的i、j、k的值。程序开头为:
for i in range(5):
for j in range(5):
for k in range(5):
(4)使用蒙特·卡罗方法计算圆周率近似值;(提示,import random,使用随机数模拟坐标)原理:假设有一个单位圆及其外切正方形,我们往正方形内扔飞镖,当扔的次数足够多以后,“落在圆内的次数/落在正方形内的次数”这个比值会无限接近“圆的面积/正方形的面积”这个比值,也就是圆周率的四分之一。模拟扔飞镖的次数越多,圆周率的近似结果越精确。
(5)暴力破解MD5值:给定一个MD5值的十六进制串'23eeeb4347bdd26bfc6b7ee9a3b755dd',该MD5值对应的明文为一个5-10个英文字符/数字的字符串,请返回它所对应的明文。
提示: from hashlib import md5. Python中的hashlib模块提供了很多常见hash算法的实现。
MD5相关方法使用举例如下:
计算MD5值:
m1 = md5() # 构造hash对象
m1 = md5('hello python'.encode())
print(m1.hexdigest()) #hexdigest()返回MD5值的十六进制字符串
字符串处理:
from string import ascii_letters, digits
迭代方法(可选):
permutations迭代器将会从可迭代对象中返回连续的、长度为r的元素排列,
from itertools import permutations
for item in permutations('WXYZ',2):
print(''.join(item))
#输出结果:
WX
WY
WZ
XW
XY
XZ
YW
YX
YZ
ZW
ZX
ZY
解题思路👇
(1)用datetime模块的today()获得当天日期,创建一个列表everymonth存储每个月的天数(暂时是平年,如果是闰年再去修改2月对应的天数为29),这里还要考虑闰年的特殊情况,所以我们要加一个判断闰年,最后用sum函数进行加和输出。
(2)创建标志变量isFinished用来标志是否已经达到过i=j=k=3,如果isFinished==True,就break跳出当前一轮的for循环,一共需要跳出三次,所以每层循环都需要加上对isFinished变量的判断。
(3)题目要求与上一题相似,不同的是当i=j=k=3时不需要跳出循环,只需要跳过打印当前i,j,k的值这一步操作,然后继续循环。
(4)使用random库里的随机函数random.random()来生成[0,1)范围的一组坐标,用inCircle记录随机落在圆内的次数,用Circle记录一共随机的次数,最后用公式算出inCircle/Circle的值就是Π/4,再乘4输出就是近似圆周率的值。
(5)使用字符集ascii_letters和digit和标点符号构成爆破字典,另外由于md5格式必须是32位,所以还需要做一个长度判断,随后用lower()统一格式,在for循环中使用permutations迭代器不断找出当前密文长度的匹配串,对其md5加密看看是否对应明文,如果是那么就解密成功。
参考代码👇
#coding:utf-8
#author:Mitchell
import datetime
import random
from hashlib import md5
from string import ascii_letters,digits
from itertools import permutations
#part1:判断今天是今年的第几天
today = datetime.date.today()
everymonth=[31,28,31,30,31,30,31,31,30,31,30,31]
if today.year%400 == 0 or (today.year%4 == 0 and today.year%100 != 0 ):
everymonth[1]=29
if today.month == 1:
print('今天是今年的第{}天'.format(today.day))
else:
print('今天是今年的第{}天'.format(sum(everymonth[:today.month-1])+today.day))
#part2:编写程序实现如下功能:循环遍历i从0到4,j从0到4,k从0到4,如果i、j、k都等于3时,输出“it’s over”,结束整个循环;否则打印i、j、k的值。
isFinished=False
for i in range(5):
for j in range(5):
for k in range(5):
if i==j==k==3:
print('it\'s over')
isFinished=True
break
else:
print('i={},j={},k={}'.format(i,j,k))
if isFinished==True:
break
if isFinished==True:
break
#part3:编写程序实现如下功能:循环遍历i从0到4,j从0到4,k从0到4,打印除i==j==k==3之外的i、j、k的值。
for i in range(5):
for j in range(5):
for k in range(5):
if not i==j==k==3:
print('i={},j={},k={}'.format(i,j,k))
#part4:使用蒙特·卡罗方法计算圆周率近似值;(提示,import random,使用随机数模拟坐标)原理:假设有一个单位圆及其外切正方形,我们往正方形内扔飞镖,当扔的次数足够多以后,“落在圆内的次数/落在正方形内的次数”这个比值会无限接近“圆的面积/正方形的面积”这个比值,也就是圆周率的四分之一。模拟扔飞镖的次数越多,圆周率的近似结果越精确。
inCircle=0
Circle=100
for i in range(Circle):
if (random.random()**2+random.random()**2)<=1:
inCircle+=1
print("The Π = ",float(4*inCircle/Circle))
#part5:暴力破解MD5值
all_letters=ascii_letters+digits+' !.,;\'\"'
def decrypt_md5(md5_value):
if len(md5_value)!=32:
print('格式错误,请输入标准32位的MD5值')
return
md5_value=md5_value.lower()
for length in range(5,10):
for item in permutations(all_letters,length):
item=''.join(item)
if md5(item.encode()).hexdigest()==md5_value:
return item
md5_value ='23eeeb4347bdd26bfc6b7ee9a3b755dd'
print('解密结果为: ',decrypt_md5(md5_value))