第1关:模拟砍价
任务描述
某电商平台开发出一个新功能:友谊验真器。“是不是朋友,帮忙砍一刀!” 一件商品价格为 price 元,假设每位朋友帮忙砍价都是整数,最少可以砍掉0元,最多只能砍掉不超过商品标价十分之一的价钱,请问每件商品至少要多少人帮忙砍价才能0元拿?
本题使用random函数库,要求使用random.randint()函数生成每次砍价的整数金额
输入格式
在一行中输入用逗号分隔的2个正整数,分别代表商品标价和随机数种子
输出格式
砍价到0元的最少次数
示例
输入:
100,10
输出:
22
# ####随机数种子的设定
# a,b = input().split(',')
# import random
# random.seed(int(b))
# a = int(a)
# b= a
# cnt = 0
# while a>0:
# a = a- random.randint(0,int(b/10))
# cnt+=1
# print(cnt)
import random
price,s = map(int,input().split(","))
p = price//10
random.seed(s)
count = 0
while price>0:
price-=random.randint(0,p)
count += 1
print(count)
第2关:素数求和
任务描述
输入一个正整数n,统计从[0,n]之间的最大的10个素数之和。本题保证测试用例至少有10个满足条件的素数。
本题要求使用自定义函数完成,代码框架参考如下:
def isprime(n): #判断素数函数
......
def f(n): #找小于等于n的素数并求和
......
......
p=int(input())
print(f(p))
示例 1
输入: 31
输出: 3+5+7+11+13+17+19+23+29+31=158
def isprime(n):
if n<2:
return False
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
def f(n):
count = 0
ls = []#产生的10个素数
for i in range(n,1,-1):
if isprime(i):
count += 1
ls.append(i)
if count ==10:
ls.sort()
return '+'.join(list(map(str,ls)))+'='+str(sum(ls))
p = int(input())
print(f(p))
第3关:数据求和
任务描述
本关任务:编写一个能计算符合条件的数求和的小程序。
编程要求
第一行中输入m
个正整数,以空格间隔; 在前m-1
个整数中找到那些能整除第m
个整数的数据,计算并输出符合条件的数据之和以及其中最大值。如果不存在符合条件的数,输出None
测试说明
平台会对你编写的代码进行测试:
测试输入: 1 2 7 21 32 49 14 51 7
预期输出: 和:91
最大值:49
测试输入: 5 1 151 12 22 100 15
预期输出: None
# # 读取第一行输入,得到m个正整数
# input_string = input()
# numbers = list(map(int, input_string.split()))
# # 验证输入是否有效
# if len(numbers) < 2 or numbers[-1] <= 0:
# print("None")
# else:
# # 提取数的数量(m)
# m = len(numbers)
# # 初始化符合条件的数之和和最大值
# sum_of_divisors = 0
# max_divisor = -1
# # 遍历前m-1个数,找出能整除最后一个数的数
# for i in range(m-1):
# if numbers[i] % numbers[m-1] == 0:
# sum_of_divisors += numbers[i] # 累加符合条件的数
# max_divisor = max(max_divisor, numbers[i]) # 更新最大值
# # 输出符合条件的数之和以及其中最大值
# if sum_of_divisors > 0:
# print(f"和:{sum_of_divisors}")
# print(f"最大值:{max_divisor}")
# else:
# print("None")
ls = list(map(int,input().split()))
lss = []
for i in range(len(ls)-1):
if ls[i]%ls[-1]==0:
lss.append(ls[i])
if lss!=[]:
print("和:{}".format(sum(lss)))
print("最大值:{}".format(max(lss)))
else:
print("None")
第4关:摩尔斯电码转换
任务描述
摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。
编写程序,把输入的英文句子转换成摩尔斯电码并输出电码字符串。
本题只需要对英文字母(不区分大小写)进行编码转换,其他字符原样输出。
下面列表中为26个英文字母对应的摩尔斯电码。
['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..']
示例 1
输入: How are you?
输出:....---.-- .-.-.. -.-----..-?
# #字母转ascii码:ord('A')
# ls = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.", "---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
# a = input()
# s = a
# for i in s:
# if i.isalpha():
# print(ls[ord(i.lower())-ord('a')],end='')
# else:
# print(i,end="")
import string
lsm = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.", "---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
s = input().lower()
code = ''
for x in s:
if x in string.ascii_lowercase:
code += lsm[ord(x)-ord('a')]
else:
code += x
print(code)
第5关:插入位置
任务描述
对一个有序的整数序列,现在要将一个整数插入进去,并保证该序列仍然有序。请输出这个数要插入的位置
第一行输入若干个整数,以空格间隔,本题保证用例中输入的数值顺序一定是从小到大,原始列表中无重复数据
第二行输入一个整数n
将整数序列放入列表ls
如果ls中已经存在n,则不插入该数,输出 Fail
以及ls列表
若ls中可以插入n,输出插入位置(从0开始计数),以及插入后的ls列表
示例
输入: 1 2 3 5
4
输出:3
[1, 2, 3, 4, 5]
# 最后的特判,新元素比列表中的都大
a = list(map(int,list(input().split())))
b = int(input())
if b in a:
print('Fail')
print(a)
else:
for i in range(0,len(a)):
if a[i]>b:
print(i)
a.insert(i,b)
print(a)
break
else:
print(len(a))
a.append(b)
print(a)
第6关:列表删除数据
任务描述
从输入的列表ls中,删除指定的数据n,并保持其他数据顺序不变。
第一行输入一行以空格间隔的整数,并放入列表ls
第二行输入一个整数n
删除整数列表中的所有的n值,并输出删除后的列表
如果原输入列表中没有n,则输出NOT FOUND
示例 1
输入: 1 1 2 2 4 6 1
2
输出: [1, 1, 4, 6, 1]
示例 2
输入: 18 9 0 7 6
-1
输出:NOT FOUND
# 列表的pop和index
ls = list(map(int,list(input().split())))
n = int(input())
if n not in ls:
print('NOT FOUND')
else:
while n in ls: #for i in range(ls.count(n))
ls.pop(ls.index(n)) #ls.remove(n)
print(ls)
第7关:上课 or 休息
任务描述
本关任务:按照武汉理工大学课表时间安排,编写一个根据输入的时间输出课堂的节数or休息。
相关知识
编程要求
按上图所示,根据输入的时间hh:mm
,输出第n节课
其中1<=n<=13
或者休息
。 本题中不允许使用eval()
转换数据类型,每节课的最后一分钟是上课时间。 测试保证输入的时间格式完整并合法,范围在00:00至23:59
测试说明
平台会对你编写的代码进行测试:
测试输入: 04:35
预期输出: 休息
测试输入: 14:25
预期输出: 第6节课
开始你的任务吧,祝你成功!
hhmm = input()
ls = ["08:00-08:45","08:50-09:35","09:55-10:40","10:45-11:30","11:35-12:20","14:00-14:45","14:50-15:35","15:40-16:25","16:45-17:30","17:30-18:20","19:00-19:45","19:50-20;35","20:40-21:25"]
flag = 0
for x in ls:
time = x.split("-")
if time[0]<=hhmm<=time[1]:
print("第{}节课".format(ls.index(x)+1))
flag = 1
if flag == 0:
print("休息")
第8关:买入股票
任务描述
本关任务:编写一个能计算最大买入股票数量的代码
相关知识
股票买入时,交易数量hand
必须为100的正整数倍,且交易所及中介机构将收取手续费。本题设定手续费率固定为交易金额price * hand
的0.1%
,且计算过程中不允许使用round()
四舍五入。
初始代码如下:
import randA
s = int(input())
price = randA.randA(s)
#上述代码将随机输出股票名称与价格,不允许修改,否则无法通过评测
#价格price为股票价格,数据类型为float
测试说明
第一行输入一个正整数,初始代码会随机生成并输出某只股票代码,名称和价格price
。 第二行输入初始账户金额S_amount
,为float
型,本题保证输入为正数。 根据股票价格price
计算初始账户金额S_amount
一次可以买入的股票最大数量hand
。 下列条件必须满足
price * hand * 1.001 <= S_amount
hand是100的正整数倍
最大可交易的hand
输出:将所有可买数量以列表形式输出,无可买数量则输出空列表;输出金额需要使用str.format()
或者f_string
保留两位小数。
测试输入: 7
20005.86
预期输出: 301225 恒勃股份 29.46
[100, 200, 300, 400, 500, 600]
使用17693.68买入600股,账户余额为2312.18元。
测试输入: 99
100
预期输出: 600599 ST熊猫 10.69
[]
资金不够,至少需要1070.07元。
开始你的任务吧,祝你成功!
import randA
s = int(input())
price = randA.randA(s)
s_amount = float(input())
ls = []
hand = 100
while price*hand*1.001<=s_amount:
ls.append(hand)
hand += 100
if ls == []:
print(ls)
print("资金不够,至少需要{:.2f}元。".format(price*100*1.001))
else:
print(ls)
print("使用{:.2f}买入{}股,账户余额为{:.2f}元。".format(price*ls[-1]*1.001,ls[-1],s_amount-price*ls[-1]*1.001))