#基础练习
练习目标
01.计算车费
题目描述
小红打车,起步价8元(3公里), 每公里收费 2 元,她打车行驶了 n 公里,通过函数封装并计算车费
输入描述
输入一个公里数
输出描述
输出应付车费
示例
输入:
5
输出:
12
#定义函数
def car_money(n):
"""计算车费"""
# 定义常量
first_money = 8
one_km_money = 2
#类型转换
first_money = float(first_money)
one_km_money = float(one_km_money)
# 计算车费
all_money = first_money + one_km_money * n
return all_money
#输入小红行驶的公里数
n = float(input("请输入行驶的公里数"))
#输出应付的车费
print("应付车费:",car_money(n))
02.整数叠加
题目描述
读取一个0到1000之间的整数,并计算它各位数字之和
输入输出描述
输入一个[0,1000]之间的整数
输出该数字的各位数字之和
提示
需要使用内置函数 len() 或者 for循环
示例1
输入:
999
输出:
27
解释:
999各位数之和为9 + 9 + 9 = 27
'''
#方法一:
#定义函数
def add_math(x):
"""计算一个数各个位上之和"""
x = int(x)
if x == 1000:
result = 1
else:
hundred = x // 100
ten = x % 100 // 10
one = x % 100 % 10
result = hundred + ten + one
return result
#输入要求和的数据
x = input ("请输入要求和的数:")
print("各个位上的数字之和为:",add_math(x))
'''
#方法二:
#定义函数
def add_math(date):
"""计算一个整数各个位上之和"""
#类型转换
date = int(date)
date_str = str(date)
#定义要使用的参数
add_date = 0
#使用for in 循环 从 date_str(字符类型)中读取 每个位上的字符
#再将这些字符数据 转化为 整数类型 进行求和处理
for x in date_str:
add_date +=int(x)
#设置返回值
return add_date
#输入要求的整数
date = input ("请输入要求和的数:")
#输出求得的整数之和
print("计算的各个位上的数字之和为:",add_math(date))
03.时间拆分
题目描述
输入分钟数,然后将该分钟数转换为年数和天数,假定一年有365天
输入描述
输入一个分钟数
输出描述
输出两行,第一行为年数,第二行为天数
示例
输入:
1000000000
输出:
1902
214
#定义函数
def time(minute):
#由题目知 是先全部转化成年数 再将未满一年的 转化为天数
#定义常量
year = 365
day = 24
hour = 60
#进行转换
yu_year = minute // hour //day //year
yu_day = minute // hour //day % year
#换行输入
print("转换年数为:",yu_year)
print("转换天数为:",yu_day)
return
#输入对应的参数
minute = int(input("请输入要转换的分钟数:"))
#输出函数结果
print(time(minute))
04.回文素数
题目描述
回文素数是指一个数既是素数又是回文数,例如131既是素数也是回文数
输出显示前100个回文素数,每行显示10个
示例
2
3
5
7
11
101
131
151
181
191
#定义筛选素数的函数(prime):
def is_prime(n):
"""用来筛选素数"""
#因为 小于2的都没有素数 而且可以防止负数数据的输入 减少了负数进入循环占用算术空间
if n < 2:
return False
#想打False 要使用大写开头
#进行遍历
for i in range(2,int(n**0.5 ) + 1 ):
if n % i == 0:
return False
return True #对于返回值 要看后面是否需要其返回的数据 如果只是判断是否符合条件 判断真假即可
#在使用range进行遍历时 因为 range (x,y) 取的值是[x,y)
#所以在这里的遍历中 防止 i 本身为整数时 错过循环 在int(n**0.5 ) 的后面加了一个1
#在之前筛选素数时, 使用的 都是将 n之前的数全部提出来 全部逐个进行一次取余的运算
#这里 因为 一个数字 如果有因数的话 两个因数中 一定会有一个数字是小于原数的平方根的
#palindrome 回文数
def is_palindrome(n):
"""翻转数据"""
#引用变量 定义一个空变量 方便后续的赋值 不然既不符合逻辑 同时也会报错
s = ""
y = ""
for i in str(n):
#在对字符 n 进行遍历时先会将组成 n 的字符 逐个遍历出来
s = i + s
#进行拼接 因为在没写数据类型转换代码的前提下 s 默认的是字符类型 而字符加 字符 就是拼接
y = int(s)
if y == n:
return y
#将值返回出来 返回的的数据和之前的数据进行判断比较 返回符合条件的数据
#定义最后的运行函数
#前面两个函数 一个筛选素数 另外一个翻转数据 这样我们可以将以原数据和翻转数据作为判断条件来验证是否是回文数
def is_prime_palindrome():
m = 0
num = 1
#开始从一开始验证数据
while m < 100:
#这里循环设置这样的条件是因为 我们需要的是前100个数
if is_prime(num) and is_palindrome(num):
#判断同时满足回文数和素数的条件
print(num, end='\t')
#输出符合条件的值 同时 在数据的最后放一个\t 防止换行
m += 1
if m % 10 ==0:
#因为要求的是 对于输出的100个数据要按照10个一行进行输出 所以在这里对于输出数据的个数进行取余处理
# 当结果为0 时 说明 满足 10个一行的条件了 就需要换行 这里是用的if 判断 刚好需要一个判断的结果
#print 的最后 会默认带上一个换行字符就达到换行的目的了
print()
num +=1
#注意缩进 在编写代码时 尽量将同一缩进的代码先编写出来
#因为设置的函数无返回值 也没有 参数 所以直接运行函数就行了
is_prime_palindrome()
05.反素数
题目描述
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
#定义素数的函数
"""判断素数"""
def is_prime(n):
if n < 2:
return False
elif n == 2:
return True
elif n > 2 :
for i in range(2 , int( n**0.5)+1):
if n % i ==0:
return False
return True
#print(is_prime(9))
# #判断回文数
def is_palindrome(n):
s = str(n)
y = ""
for m in s:
y =m+y
if int(y) == n and is_prime(int(y)):
return True
return False
#print(is_palindrome(151))
#将上面两个函数结合 并输出正确数据
def is_prime_palindrome_palindrome_prime():
#参数 的变化 和100个数据的设定
m = 0
num = 1
while m <=100:
if is_prime(num) and is_palindrome(num):
#当使用 and 连接时 要俩个均为真 才对
print(num, end='\t')
m += 1
if m % 10 ==0:
print()
num += 1
is_prime_palindrome_palindrome_prime()
06.双素数
题目描述
双素数是指一对差值为2的素数,例如3和5就是一对双素数,5和7也是一对双素数
输出显示小于1000的双素数
#双素数 在素数的基础上
#加上一个验证两个相邻素数 的差为2 的函数
def is_prime(n):
"""判断素数"""
if n < 2:
return False
elif n == 2:
return True
elif n > 2 :
for i in range(2 , int( n**0.5)+1):
if n % i ==0:
return False
return True
#先写出前1000的素数
def is_two():
"""判断两个相邻素数 差值为2"""
n = 1
while n < 1000:
if is_prime(n) and is_prime(n+2):
print(n,n+2)
n += 1
is_two()
07.梅森素数
如果一个素数可以写成2的p次方-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数q
输出p≤31的所有梅森素数
def is_prime(n):
"""判断素数"""
if n < 2:
return False
elif n == 2:
return True
elif n > 2 :
for i in range(2 , int( n**0.5)+1):
if n % i ==0:
return False
return True
#写出梅林数 再在梅林数中筛选素数
p =1
while p <= 31:
x = 2**p -1
if is_prime(x):
print(x)
p += 1
08.堆叠相加
题目描述
现有堆叠相加模式 a + a a + a a a + a a a a + a a a a a + . . . . . . a+aa+aaa+aaaa+aaaaa+...... a+aa+aaa+aaaa+aaaaa+......
例如:+2+22+222+2222+2222,其中a为2,且有5组数字
输入输出描述
输入两个数据分别为数字a和组数n
输出按照堆叠相加模式算出的和
示例
输入:
3 4
输出:
3702
解释:
3 + 33 + 333 + 3333 = 3702
def add():
x = input("请输入原数")
y = int(input("请输入需要组数"))
m = 1 # 计算组数的变量
all = 0 #求和的数据
j = x
while m <= y:
j = int(j)
all = int(all)
all += j
j = str(j)
j += str(x)
m += 1
return all
# 先拼接需要的字符 并注意字符转换 在进行相加
print(add())
09.检测密码
题目描述
一些网站会给密码强加一些规则:
(1)密码必须至少有8个字符
(2)密码只能包含英文字母和数字
(3)密码应该至少包含两个数字
(4)密码应该至少包含两个大写字母
如果密码符合规则,输出Yes;否则输出No
输入输出描述
输入一串密码
输出该密码是否符合规则
示例1
输入:
123456ab
输出:
No
示例2
输入:
123abcABC
输出:
Yes
def number_detections(n):
if len(n) >= 8:
#计算 字符数的内置函数len()
return True
return False
def alphabet_math(n):
#计数器
# n = input("请输入要检测的密码")
math = 0
max_alphabet = 0
min_alphabet = 0
n = str(n)
for i in n:
#检查数字
if 48 <= ord(i) <= 57:
math +=1
#检查大写字母
elif 65 <= ord(i) <= 90:
max_alphabet +=1
#检查小写字母
elif 97 <= ord(i) <= 122:
min_alphabet +=1
#判断是否符合条件
if math > 0:
return True
if max_alphabet >= 2:
return True
if min_alphabet >= 2:
return True
else:
return False
def password_verification():
m = input("请输入要检测的密码")
if alphabet_math(m) and number_detections(m):
print("YES")
else:
print("NO")
password_verification()
10.指定等级
题目描述
读入学生成绩,获取最高分best,然后根据下面的规则赋等级值:
(1)如果分数≥best-10,等级为A
(2)如果分数≥best-20,等级为B
(3)如果分数≥best-30,等级为C
(4)如果分数≥best-40,等级为D
(5)其他情况,等级为F
输入输出描述
输入两行,第一行输入学生人数n,第二行输入n个学生的成绩
输入n行,表示每个学生的成绩等级
示例
输入:
4
40 55 70 58
输出:
学生0分数为40,等级为C
学生1分数为55,等级为B
学生2分数为70,等级为A
学生3分数为58,等级为B
score = []
def score_all():
member = int(input("请输入学生人数: "))
for m in range(member):
score.append(int(input("请输入成绩: ")))
#获取最高分
best = max(score)
best = int(best)
#开始赋等级
for i in score:
i = int(i)
if i >= best - 10:
print("等级为A")
elif i >= best - 20:
print("等级为B")
elif i >= best - 30:
print("等级为C")
elif i >= best - 40:
print("等级为D")
else:
print("等级为F")
score_all()
拓展作业
w01. 斐波那契数列
题目描述
斐波那契数列是一种特殊的数列,很多生活和企业场景中都能见到满足该数列的数据排列方式;现在要求你封装一个用于获取斐波那契数列数据的功能函数,用于底层数据支持;
输入描述
输入一个整数n
输出描述
输出位置为n的斐波那契数列对应的数据
示例
输入:1
输出:1
输入:3
输出:2
输入:8
输出:21
def sequence(n):
n = int(n)
m = 2 #设置一个计数器
if n == 1: print("输出:",0)
elif n == 2 :print("输出:",1)
elif n < 1 :print("输入数据有误")
#正式开启 斐波那契数列数列的算法
elif n > 2 :
#定义常量
x = 0
y = 1
z = 0
#以计数器来作为循环条件
while m != n:
#观察斐波那契数列可知 在一个加法运算中
# 前一个加法的和作为加数 参与下一个数据加法的运算中
z = x + y
x = y
y = z
m += 1
return z
#输出结果
print(sequence(input("请输入要求数据的位置为:")))
w02. 密码等级校验
题目描述
按照用户输入密码的字符,判断用户的密码强度,基本要求如下
- 弱:都是数字,或者都是大写字母/小写字母组成的密码
- 中等:[数字、大写字母] 或者 [数字、小写字母] 或者 [大写字母、小写字母] 或者 [大小写字母、数字]组成的密码
- 强:[数字、大写字母] 或者 [数字、小写字母] 或者 [大写字母、小写字母]并结合特殊符号组成的密码
输入描述
用户输入一个字符串密码
输出描述
输出密码强度等级
示例
输入:abcdef
输出:弱密码
输入:abc123
输出:中等强度
输入:Abc123%
输出:强密码
#这里应该会使用ASCII码 的大小 来判断 大小写英文 和是否有英文
#在 Python 中,可以使用内置函数chr()将 ASCII 码值转换为对应的字符,
# 使用ord()函数将字符转换为对应的 ASCII 码值
#48-122 在数字和 字母在的范围 91-96 是大小写的界限 也是特殊字符
#这里要设置一个类似于计数器 的东西 用来判断密码的强度
def password_verification(n):
n = str(n)
number = 0
math = False
capital = False
lowercase = False
#循环遍历 密码中的每个字符 通过ASCII 码 判断字符的种类
for i in n:
if 48 <= ord(i) <= 57:
math = True
elif 65 <= ord(i) <= 90:
capital = True
elif 97 <= ord(i) <= 122:
lowercase = True
else:
return False
if math:
number +=1
if capital:
number +=1
if lowercase :
number +=1
else:
number +=0
if number == 1: return "弱密码"
elif number == 2:return "中密码"
elif number == 3:return "强密码"
else : return "输入的密码有误"
print(password_verification(input("请输入要检验的密码:")))
w03. 密码加密
题目描述
编写一个函数,实现密码的错位加密
编写一个函数,实现密码的错位解密
输入描述
输入一个字符串明文密码;
输入一个字符串密文数据;
输出描述
打印展示加密后的字符串密文
打印展示解密后的明文字符串
示例
输入:
abc # 明文
def # 密文
输出:
cde # 错位密文(具体错位可以自定义)
cde # 解密明文(具体错位可以自定义)
代码实现
- 下面代码已经实现了基本功能,但是存在BUG(请找出并修正它)
def encrypt(password, n=4):
"""加密函数"""
ep = ""
for i in str(password):
ac = ord(i)
ac += n
_ac = chr(ac)
ep += _ac
return ep
def decrypt(password, n=4):
"""解密函数"""
pwd = ""
for i in str(password):
ac = ord(i)
ac -= n
_ac = chr(ac)
pwd += _ac
return pwd
pd = input("请输入明文数据:")
print("加密后的数据:", encrypt(pd, 5))
pd2 = input("请输入密文数据:")
print("解密后的数据:", decrypt(pd2, 5))
修改后:
def encrypt(passwords,n=4):
""""加密函数"""
#定义一个空变量 方便后续的使用
ep = ""
#将形参转化成字符后进行遍历
for i in str(passwords):
#将遍历出来的字符转换成ASCII码 赋值给ac
ac = ord(i)
#设置加密的进制
ac +=n
#设置ASCII 的范围
if ac > 127: # 限制在 ASCII 码的有效范围内
ac = 32 + (ac - 127)
elif ac < 32: # 限制在 ASCII 码的有效范围内
ac = 127 - (32 - ac)
#将加密后的数据通过转化成 字符 赋值给新的参数_ac
_ac = chr(ac)
#因为每个字符被转化回来的话 也是字符的形式 所以可以直接才用加法进行拼接
ep += _ac
return ep
#print(encrypt(input("请输入需要加密的密码:"),int(input("输入加密进制"))))
pd = input("请输入明文数据:")
print("加密后的数据:", encrypt(pd, 5))