栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python】练习题——循环的使用(判断今天是今年的第几天、使用蒙特·卡罗方法计算圆周率近似值、暴力破解MD5值)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python】练习题——循环的使用(判断今天是今年的第几天、使用蒙特·卡罗方法计算圆周率近似值、暴力破解MD5值)

题目

(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))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/329198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号