概念类题目
1.我们知道在游戏运行后,通常是玩家中断游戏或者主角被打败了,才会退出游戏。那么现在让你来开发一个游戏,你觉得应该如何实现这个机制(可以画流程图,也可以简单概述)?
正解:利用while循环实现游戏主体,当触发退出游戏机制的时候(就是玩家中断游戏或者主角被打败了)搭配break语句跳出循环。
2.. 请看下面代码,当 break 语句执行之后,程序是跳转到位置 1 还是位置 2 呢?
>>> day = 1
>>> while day <= 7:
>>> while hour <= 8:
... print("今天,我一定要坚持学习8个小时!")
... hour += 1
... if hour > 1:
... break
... # 位置1
... day += 1
... # 位置2
正解:位置1
解析:无论是多少层循环,break语句和continue语句1都只能作用于离它最近的那一层
3.下面代码存在两个问题,细心的你发现了吗?
>>> while True:
... command = input("请输入命令(exit/pow):")
... if command == "pow":
... base = input("请输入底数:")
... exp = input("请输入指数:")
... pow(base, exp)
... elif command == "exit":
... continue
正解:第 4 和第 5 行代码使用 input 函数获取的是一个字符串结果,如果要作为 pow() 函数的参数使用,应该将它们转换成整数。第 8 行按照题意应该是“用户输入 exit 表示退出程序”,所以应该将 cotinue 修改为 break
那么改正后的代码如下
>>> while True:
... command = input("请输入命令(exit/pow):")
... if command == "pow":
... base = int(input("请输入底数:"))
... exp = int(input("请输入指数:"))
... pow(base, exp)
... elif command == "exit":
... break
pow函数
pow函数是一个内置函数,用于计算一个数的幂。
语法如下:
1. pow( x , y ) : x 的 y 次幂
eg: pow( 2 , 4 )
运行结果为16
2. pow( x , y , z ) : x 的 y 次幂除以 z 的余数。
eg: pow( 2 , 4 , 5 )
运行结果为1
pow函数的注意事项:
1.z省略时,y 和 x的值可以是整数也可以是浮点数。
2.z存在时,x 和 y 只能是整数
3.参数z不能为0,否则会报错
上机类题目(真的难)
1.写一个代码,实现结果如下图所示:
我写的,没有运行出来
while 1:
input("请输入一个口号(输入STOP结束):")
if answer == STOP:
break
正解:
while True:
slogan = input("请输入一个句口号(输入 STOP 结束):")
if slogan == "STOP":
break
print(slogan)
自己的问题:
a.首先没有给用户输入的变量命名,但是下面又用到”amswer“
b.然后第三行的STOP需要把它写成字符串,而不是变量命名
c.总是忘记最后要把运行结果打印出来
2.更新模拟抛硬币实验
之前的抛硬币实验的代码
counts = int(input("请输入抛硬币的次数:"))
i = 0
print("开始抛硬币实验:")
while i < counts:
# 生成1到10的一个随机数
num = random.randint(1, 10)
# 如果随机数可以被2整除,则代表正面,否则代表反面
# num是随机的,所以正面和反面的概率也是随机的
if num % 2:
print("正面", end=" ")
else:
print("反面", end=" ")
i += 1
更新要求:
- 如果抛硬币的次数小于 100,则打印每次的结果,否则不打印
- 统计最终正面和反面的次数
小甲鱼的正解:很奇怪,照这写出来的也是有错误的,水平有限
#更新抛硬币实验#while循环 random语句 if分支结构
import random
counts = int(input("请输入抛硬币的次数:"))
#利用ignore变量判断是否打印每次的结果
if counts > 100:
ignore = True
else:
ignore = False
heads = 0#统计正面的次数
tails = 0#统计反面的次数
i = 0
print("开始抛硬币实验......")
while i < counts:
num = random.randint(1,10)
if num % 2:
heads += 1
if not ignore:
print("正面",end="")
else:
tails += 1
if not ignore:
print("反面",end= "")
i+=1
print("")
print("一共模拟了",counts,"次抛硬币实验,结果如下:")
print("正面:",heads,"次",sep="")
print("反面:",tails,"次",sep="")
而且运行结果也是有所出入
2.将九九乘法表倒过来打印
程序实现效果图如下
正解:还是有很多不懂的地方,慢慢来吧,加油
>>> i = 1
>>> while i <= 9:
>>> j = 9
>>> while j >= i:
>>> print(j, "*", i, "=", j * i, end=' ')
>>> j -= 1
>>> print()
>>> i += 1
3.找出 10 以内的所有素数,如果不是素数,请打印出该合数对应的乘积公式。
程序实现效果图如下:
n = 2
while n < 10:
x = 2
while x < n:
if n % x == 0:
print(n, "=", x, "*", n // x)
break
x += 1
else:
print(n, "是一个素数")
n += 1
4.判断100到999之间的所有水仙花数
我写的:
for i in range(1,10):
for j in range(0,10):
for k in range(0,10):
if i**3+j**3+k**3==i*00+j*0+k:
x = i*100+j*10+k
print(x,"是水仙花数")
还写了另一个版本:
#判断水花仙数
for x in range(100,1000):
i = x % 10
j = x//10 %10
K = x //100
if x == i**3+j**3+k**3:
print(x,"是水仙花数")
不知道为什么,两个都运行不出来,看看正解:
for i in range(100, 1000):
sum = 0
temp = i
while temp:
sum = sum + (temp % 10) ** 3
temp //= 10
if sum == i:
print(i)
大概意思就是:sum = sum + (temp % 10) ** 3 为了避免污染源数据 i,我们创建了新变量 temp。
接着,要将一个整数的每个“位”拆解出来,可以搭配使用求余数运算符(%)和整除运算符(//),比如 123 % 10 就得到最后一位 3
所以,sum = sum + (temp % 10) ** 3 的功能就是每次将最后一位计算三次方的结果累加到 sum 变量里面
temp //= 10 这句就不难理解了,123 拿出 3 之后,下一步就应该是拿倒数第二位来算三次方了,所以我们应该将 123 去掉一位,变成 12,那十进制数去掉末位的方法当然就是除以 10 咯。
5.判断一个数是否为回文数
回文数就是正这读和反这读都是一样的 比如:12321
我没写出来,我连解析都没看懂
正解+解析:
x = int(input("请输入一个正整数:"))
if x < 0 or (x % 10 == 0 and x != 0):
print("不是回文数。")
else:
revertedNumber = 0
while x > revertedNumber:
revertedNumber = revertedNumber * 10 + x % 10
x //= 10
if x == revertedNumber or x == revertedNumber // 10:
print("是回文数。")
else:
print("不是回文数。")
解析:
难点一:为什么一旦满足 x < 0 or (x % 10 == 0 and x != 0) 这两种情况,就说明该数不是回文数?
负数很好理解,因为前面有一个负号(-),你没办法把它放到后面去;第二种情况是当数字的最后一位为 0 时,为了使该数字符合回文数的规则,那么这个数字的第一位也应该为 0,纵观所有自然数,只有 0 满足这一特点……
所以,当一个数最后一位为 0,但这个数不是 0 的话,那么这个数毋庸置疑不是回文数
难点二:循环应该在什么时候结束?
答:常规的想法是搭配使用求余数运算符(%)和整除运算符(//),将 x 每一位都进行对应的前后翻转,即将 12345 依次变为 54321……
但真的有必要吗?来自
Mbc0p)3h?}(.g'!^w_$A
其实并无必要!Powered
eqVc&Sd4utNPHOK (k0C~rDX!2
我们只需要反转一半即可,因为如果该数字是回文数,那么其后半部分翻转后应该与原始数字的前半部分相同。;2].[N
Ow8 }aMXIZp@Q[g;Uz.0A7S2G
例如:输入 1221,我们可以将数字后半部分从 21 翻转为 12,并将其与前半部分 12 进行比较,因为二者相同,我们得知数字 1221 是回文。
难点三:如果该数字的位数是奇数,那么反转后的数字位数会比原来的一半多一位。
所以,if x == revertedNumber or x == revertedNumber // 10 才对两种情况(左侧是当 x 的位数是偶数时;右侧是当 x 的位数是奇数时)进行判断。
专题错题结束,但是我真的不理解最后两个,尤其是最后一个,真的希望有人看到能给我讲一下。
a