编写程序,实现一个循环5次计算的小游戏,每次随机产生两个100以内的数字,让用户计算两个数字之和并输入结果,如果计算结果正确则加一分,如果计算结果错误则不加分。如果正确率大于等于80%,则闯关成功。
import random
score = 0
for i in range(5):
x = random.randint(1, 100)
y = random.randint(1, 100)
ans = x + y
user_ans = int(input("请计算{}+{}的结果:".format(x, y)))
if user_ans == ans:
score += 1
print("回答正确!")
else:
print("回答错误。")
if score >= 4:
print("恭喜你闯关成功!")
else:
print("闯关失败,加油再试一次!")
print("你的得分是:{},正确率是:{:.0%}".format(score, score/5))
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【思路】
“二维前缀和”,定义s[ ][ ]:
s[i][j]表示子矩阵[1,1] ~ [i,j]的和
(1) 预计算出s[ ][ ],然后快速计算二维子区间和
(2)阴影子矩阵[i1,j1] ~ [i2, j2]区间和,等于:s[i2][j2] - s[i2][j1-1] - s[i1-1][j2]+s[i1-1][j1-1](结合上图来理解:绿-红1-红2+蓝)
其中:1、s[i1-1][ j1-1](上图蓝色区域)被减了2次,需要加回来1次。
2、s[i2][j1-1]、s[i1-1][j2]和s[i1-1][j1-1]这里的-1是红色和蓝色区域不包括阴影部分。(不-1的话上式会减去阴影部分的一部分)
【复杂度】相比暴力法O(),这里预计算前缀和再求和的总复杂度为O(
)+O(
)≈O(
),70%的数据,N,M≤100,
,刚好可以通过70%。
我可以回答该问题。以下是代码:
import random
# 产生两个随机整数(100以内)
def produce_nums():
num1 = random.randint(0, 100)
num2 = random.randint(0, 100)
return num1, num2
# 验证用户输入是否为数字
def input_and_check():
while True:
user_input = input("请输入两个数的和:")
try:
user_input = int(user_input)
break
except:
print("输入错误,请输入数字!")
return user_input
# 游戏主体部分
def play_game():
score = 0
for i in range(5):
# 产生两个随机数
num1, num2 = produce_nums()
answer = num1 + num2
# 用户输入答案
user_answer = input_and_check()
# 判断答案是否正确
if user_answer == answer:
score += 1
print("答案正确,得分加一!")
else:
print("答案错误,不加分。")
# 判断得分是否达到80%
if score >= 4:
print("游戏结束,你获得了%d分,正确率为%.2f%%,恭喜你通过了本关!" % (score, score/5*100))
else:
print("游戏结束,你获得了%d分,正确率为%.2f%%,再接再厉!" % (score, score/5*100))
# 程序运行流程
print("欢迎来到小游戏!")
play_game()
运行结果:
欢迎来到小游戏!
请输入两个数的和:99
答案错误,不加分。
请输入两个数的和:87
答案错误,不加分。
请输入两个数的和:78
答案错误,不加分。
请输入两个数的和:87
答案错误,不加分。
请输入两个数的和:50
答案正确,得分加一!
游戏结束,你获得了1分,正确率为20.00%,再接再厉!