1.验证 6174 猜想。
1955 年,卡普耶卡(D.R.Kaprekar)对 4 位数字进行了研究,发现一个规律:
对任意各位数字不相同的 4 位数,使用各位数字能组成的最大数减去能组成的最小数,对得到的差重复这个操作,最终会得到 6174 这个数字,并且这个操作最多不会超过 7 次。请编写程序验证这个猜想,并输出计算次数。(难点在于如何求解最大数和最小数)
def Min_Number (a):
a=str(a)
arr=[]
for i in range(0,4):
arr.append(a[i])
arr.sort()
return int(''.join(arr))
def Max_Number(a):
a=str(a)
arr=[]
for i in range(0,4):
arr.append(a[i])
arr.sort(reverse=True)
return int(''.join (arr))
a=input("输入:")
while (int(a)!=6174):
a=Max_Number(a)-Min_Number(a)
print (a,end="")
- 判断水仙花数。
水仙花数(Narcissistic number)也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
设计循环程序,输入一个三位整数,判断是否是水仙花数,如果是水仙花数,则输出“是水仙花数”,否则输出“不是水仙花数”。
def IsFlower(num):
a=num//100
b=num//10%10
c=num%100%10
return a**3+b**3+c**3
while True:
Num=input("输入:")
while Num!="":
Num=eval(Num)
if 0<=Num<=999:
if Num==IsFlower(Num):
print ("{}是水仙花数".format(Num))
else:
print ("{}不是水仙花数".format(Num))
else:
print("输入数值不合理,请重新输入:")
Num=input("请输入一个三位整数:")
break
3.爬楼梯。
假设一段楼梯共 n 个台阶,小明一步最多能上 3 个台阶。编写程序计算小明上这段楼梯一共有多少种方法。
def climbStairs2(n):
first3={1:1,2:2,3:4}
if n in first3.keys():
return first3[n]
else:
return climbStairs2(n-1)+climbStairs2(n-2)+climbStairs2(n-3)
num=eval(input("请输入台阶数:"))
print("台阶数\t上楼方法")
print("{0:^6d}\t{1:^10d}".format (num,climbStairs2(num)))
4.抓狐狸游戏。
编写程序,模拟抓狐狸小游戏。假设一共有一排 5 个洞口,小狐狸最开始的时候在其中一个洞口,然后玩家随机打开一个洞口,如果里面有狐狸就抓到了。如果洞口里没有狐狸就第二天再来抓,但是第二天狐狸会在玩家来抓之前跳到隔壁洞口里(random库中 choice, randrange 使用)
import random
def catchMe(n=5,maxStep=10): #五个洞口,最多允许抓十次
position=[0]*n; #n个洞口有狐狸就为1,没有狐狸就为0
oldpos=random.randrange(0,n)
position[oldpos]=1 #随机给小狐狸一个位置
#玩家开始抓狐狸
m=1
while m<=maxStep:
#判断输入正确
print("第{}次".format(m))
while True :
try:
x=int(input("今天你要开哪个洞口(0-4):"))
assert 0<=x<=4 #输入的洞口值要合法,如果不合法抛出异常
break
except:
#输入不正确执行下面代码
print("请输入正确的洞口")
#判断有没有找到
if position[x]==1:
print("Congratulation!")
break
else:
print("Try again!")
#小狐狸换洞口,洞口有两个可能,
if oldpos==0:
newpos=oldpos+1
elif oldpos==n-1:#为最后一个洞口
newpos=0
else:
newpos=oldpos+random.choice((-1,1))
position[oldpos],position[newpos]=0,1 #将位置更新
m=m+1 #次数+1
else:
print("You fail")
catchMe()