Python练习题
- 1. 素数
- 2. 兔子数量
- 3a. 空心矩形
- 3b. 直角三角形
- 4. 利用函数输出直角三角形
- 5. 乘法口诀表
- 6. 等腰三角形
- 7. 利用函数输出等腰三角形
- 8. 菱形
- 9. 空心菱形
- 10. 平行四边形
- 11. 有1,2,3个数字,能组成多少个互不相同并且不重复的数字呢?
- 12. 现在有三个数,分别为a,b,c,它们之间的和为19,取值范围1-9(包括9),但是a,b,c之间不相等,求出能组成多少个互不相同并且不重复的数字?
- 13. 猴子摘桃
- 14. 斐波那契数
- 15. 小球问题
- 16. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和。
- 17. 求1到100之间的偶数之和
- 18. 累乘,累加
- 19. 求最大公约数和最小公倍数
- 20. 输入三个数,将这三个数从小到大输出
- 21. 输入三个数字,输出最小的数字
- 22. 判断一个三位数是否为水仙花数
- 23. 将一个正整数分解质因数。
- 24. 在键盘中输入一行字符,分别统计出其中的字母,空格,数字以及其它的字符
- 25. 完数
- 26. 回文数
- 27. 反向输出
- 28. 删除英语单词后缀 er ly ing结尾
- 29. 乒乓球队比赛
- 30. 利用递归函数调用方式,将输入的字符以相反的顺序打印输出
- 31. 利用递归求年龄
- 32. 利用递推求年龄
- 33. 短信计费
- 34. 登录验证(分支结构)
- 35. 从键盘输出一些字符,挨个把他们写入磁盘文件上,知道输入一个#结束
- 36. 将列表转换为字典
- 37. 回文串(下标,分支结构)
1. 素数
概念:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
简单理解就是除了1和它本身外不能被其它自然数整除。
分析:
1.写一个自定义函数,用来判断是否为素数,如果是返回True,反之False
2.函数为什么要 m % i == 0,我们要让m和它小的数求余,如果等于0,就为素数
3.通过键盘输入一个数,调用所编写的函数,判断所输入的数是否为素数
def IsSu(m):
if m == 1:
return false
for i in range(2,m): # 遍历2,3,4,5,6....m-1,都放在i中,如果m除i等于0 则为素数
if m % i == 0:
return False # 不是素数
else:
return True # 是素数
while True:
a = int(input("请输入一个素数:"))
if IsSu(a):
print("是素数")
else:
print("不是素数")
2. 兔子数量
有一群兔子,4个4个数余1个,5个5个数余2个,9个9个数余7个,试问兔子有多少只?
def fun(m):
while True:
if m % 5 == 2:
break
m += 9
while True:
if m % 4 == 1:
break
m += 45
print(m)
fun(16)
3a. 空心矩形
for i in range(1,5):
for j in range(1,5):
if i == 1 or i == 4 or j == 1 or j == 4:
print("*",end="")
else:
print(" ",end="") # 打印空心部分
print("") # 换行
3b. 直角三角形
外层循环输出是每行的内容,内层循环输出的是每一列的内容
for i in range(1,7):
for j in range(i):
print("*",end="")
print()
4. 利用函数输出直角三角形
def fun(n):
for i in range(1,n + 1):
for j in range(i):
print("*",end="")
print()
fun(7)
5. 乘法口诀表
for i in range(1,10):
for j in range(1,i+1):
print(str(j) + "*" + str(i) + "=" + str(i*j),end=" ")
print()
for i in range(1,10):
for j in range(1,i+1):
print('{}*{}={}'.format(j,i,(i*j)),end=' ')
print()
6. 等腰三角形
分析:
for i in range(1,5): # range(5),输出4行
for j in range(1,4 - i + 1): # 空格数:行数减一,这里为什么加1?请注意range()的取值范围
print(" ",end="")
for j in range(1,i + 1): # 正着的数:行数
print(j ,end="")
for j in range(i-1,0,-1): # 倒着的数:行数减一
print(j,end="")
print()
7. 利用函数输出等腰三角形
def fun(n):
for i in range(1,n + 1):
for j in range (1,n - i + 1): # 输出空格
print(" ",end="")
for j in range(1,i + 1):# 正着的数
print(j,end="")
for j in range(i - 1,0,-1):# 倒着的数
print(j,end="")
print() # 换行
fun(5) # 调用
8. 菱形
for i in range(1,5): # range(5),输出4行
for j in range(1,4 - i + 1): # 空格数
print(" ",end="")
for j in range(1,i + 1): # 正着的数
print(j ,end="")
for j in range(i-1,0,-1): # 倒着的数
print(j,end="")
print()
for i in range(1,5):# range(5),输出4行
for j in range(1,i + 1): # 空格数
print(" ",end = "")
for j in range(1,4 + 1 - i):# 正着的数
print(j,end = "")
for j in range(4 - i - 1,0,-1):# 倒着的数
print(j,end="")
print()
输出结果如下:
9. 空心菱形
for i in range(1,5): # range(5),输出4行
for j in range(1,4 - i + 1): # 空格数
print(" ",end="")
for j in range(1,i + 1): # 正着的数
if(j == 1):
print(j,end="")
else:
print(" ",end="")
for j in range(i-1,0,-1): # 倒着的数
if(j == 1):
print(j,end="")
else:
print(" ",end="")
print()
for i in range(1,5):# range(5),输出4行
for j in range(1,i + 1): # 空格数
print(" ",end = "")
for j in range(1,4 + 1 - i):# 正着的数
if(j == 1):
print(j,end="")
else:
print(" ",end="")
for j in range(4 - i - 1,0,-1):# 倒着的数
if(j == 1):
print(j,end="")
else:
print(" ",end="")
print()
10. 平行四边形
for i in range(1,6):
for j in range(5 - i):
print(" ",end="")
for j in range(6):
print("*",end="")
print()
11. 有1,2,3个数字,能组成多少个互不相同并且不重复的数字呢?
for i in range(1,4):
for j in range(1,4):
for k in range(1,4):
if i != j and i != k and j != k:
print(i,j,k)
12. 现在有三个数,分别为a,b,c,它们之间的和为19,取值范围1-9(包括9),但是a,b,c之间不相等,求出能组成多少个互不相同并且不重复的数字?
n = 0
for a in range(1,10):
for b in range(1,10):
for c in range(1,10):
if a != b and a != c and b != c and a + b + c == 19:
print(a,b,c)
n += 1
print("组合有"+str(n)+"种")
13. 猴子摘桃
猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个;
第二天又将剩下的桃子吃掉一半,又多吃了一个。
以后每天都吃了前一天剩下的一半零一个。
到第 10 天再吃时,见只剩下一个桃子了。
求第一天共摘了多少?
分析:
因为每天都是吃下前一天的一半再加上1个,所以我们可以先加上1一个再乘以2,就可以求出前一天的桃子数
a = 1 # 第十天剩下桃子的数量
for i in range(9,0,-1):
a = (a + 1)* 2
print("猴子第"+str(i)+"天有"+str(a)+"个桃子")
输出结果如下:
14. 斐波那契数
1,1,2,3,5,8,13,21……,输出其前20个数字
a,b,c=1,1,0
print("1,1",end="")
for i in range(3,20 + 1):
c = a + b
print(",",c,end="")
a = b
b = c
15. 小球问题
一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下, 求它在第 10 次落地 时,共经过多少米?第 10 次反弹多高?
sum = 100
a = sum / 2
for i in range(2,11):
sum += 2 * a
a /= 2
print("共经过"+str(sum)+"米")
print("第 10 次反弹"+str(a)+"米")
16. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前 20 项之和。
a = 2
b = 1
c = 0
print("2/1")
for i in range(1,20):
c = a + b
b = a
a = c
print(str(a)+"/"+str(b))
17. 求1到100之间的偶数之和
sum = 0
for i in range(1,101):
if i % 2 == 0:
sum = sum+i
i += 1
print(sum)
18. 累乘,累加
a = 1
b = 0
for i in range(1,11):
a *= i
b += i
print(a)
print(b)
19. 求最大公约数和最小公倍数
题目: 输入两个正整数,求其最大公约数和最小公倍数
分析:
1)最大公约数(最大公因数):几个数公有的因数中最大的一个。
例"12与18
12的因数: 1,12,2,6,3,4
18的因数: 1,18,2,9,6,3
公有因数: 1, 2, 3,6,
12与18的最大公约数:6
2)最小公倍数:几个数公有的倍数中最小的一个。
例4和6
4的倍数: 4,8,12,16,20,24,
6的倍数: 6,12,18,24,
4和6的最小公倍数: 12
3)辗转相除法(欧几里得算法):用于计算两个非负整数a,b的最大公约数。
两数为a、b(b <a),用辗转相除法,求它们最大公约数(a、b)的步骤如下:
1997 / 615 = 3 (余 152)
615 / 152 = 4 (余7)
152 / 7 = 21 (余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
以除数和余数反复做除法运算,当余数为 0 时,
取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
关于辗转相除法的详解可以百度搜索。
temp = 0
a = 0
b = 0
num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
## 辗转法求最大公约数
## 被除数必须是两数中最大的,如果不是就交换位置
if(num1 < num2):
temp = num1
num1 = num2
num2 = temp
a = num1
b = num2
while(b != 0):
temp = a % b
a = b
b = temp
print("输出最大公约数:",a)
# 输出最小公倍数 = 两个数相乘 / 最大公约数
print("最小公倍数:",num1 * num2 / a)
20. 输入三个数,将这三个数从小到大输出
a = []
for i in range(1,4):
b = int(input("请输入第"+str(i)+"个正整数:"))
a.append(b)
a.sort()
print(a)
21. 输入三个数字,输出最小的数字
a = int(input("请输入第1个正整数:"))
b = int(input("请输入第2个正整数:"))
c = int(input("请输入第3个正整数:"))
if(a > b):
a = b
if(a > c):
a = c
print(a)
22. 判断一个三位数是否为水仙花数
编写一个程序,判定输入三位数是否是水仙花数。
说明: “个位的立方+十位的立方+百位的立方 等于这个数本身”,则这个数就是水仙花数;
例如:153=1的立方+5的立方+3的立方
需要先求出 个位、十位、百位的数字各是几,然后才能进行计算。
比如这个数字为153
个位:对153进行余10,结果为个位数3
十位:先将153除以10得到十位和百位(15),再余10得到十位数5
百位:153除以100 得出百位数1
a = eval(input("请输入一个数字"))
bw = a // 100 # 整除获得百位数("//" 表示整除,比如 3//2=1; "/" 表示浮点运算,比如3/2=1.5)
sw = a // 10 % 10 # 或者b = (i % 100) // 10
gw = a % 10
s = pow(gw, 3) + pow(sw, 3) + pow(bw, 3)
if (s == a):
print(a, end="")
print("是水仙花数!")
else:
print(a, end="")
print("不是水仙花数")
23. 将一个正整数分解质因数。
例如输入90,输出:90=2*3*3*5
对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。
n = int(input("请输入一个数:"))
print(n,'=',end="")
i = 2
while i <= n:
if i == n:
print(i, end="")
break
elif n % i == 0:
print(i, end="*")
n = n / i
else:
i += 1
24. 在键盘中输入一行字符,分别统计出其中的字母,空格,数字以及其它的字符
le = 0 # 统计字母的数量
sp = 0 # 统计空格的数量
num = 0 # 统计数字的数量
sybol = 0 # 统计其它符号的数量
a = input("请输入一段字符")
for i in a:
if i.isalpha():#判断是否为字母
le+=1
elif i.isdigit():#判断是否为数字
num+=1
elif i.isspace():#判断是否为空格
sp+=1
else:
sybol+=1
print('该字符串中含有%i个字母,%i个数字,%i个空格,%i个其他字符'%(le,num,sp,sybol))
25. 完数
题目: 输出1000以内的完数,并统计完数的个数
一个数等于它的因子之和,这个数就被称为完数,例如:6 = 1 + 2 + 3,6的因子为:1,2,3
n = 0 # 完数个数
for a in range(1,1001):
list=[]
for b in range(1,a):
if a % b == 0: # 把因子找出来,放进列表中
list.append(b)
if a == sum(list):
print(a)
n +=1
print("1000以内的完数有"+str(n)+"个")
26. 回文数
比如:123321,它们的第一位和最后一位都相同,第二位和倒数第二位相同
n = input("请输入数字")
a = 0
b = len(n)-1 # 长度减一,去掉中间的一个数字
flag = True
while a < b:
if n[a] != n[b]: # 下标来判断是否相等
print("不是回文数")
flag = False
break
# print(a,b)
a,b = a+1,b-1
if flag:
print("是回文数")
27. 反向输出
按照相反的顺序输出列表的值
a = [1,2,3,4,5,6]
print(a[::-1]) # 步长为1的反向输出
# 第一个冒号前后都省略,所以输出所有值,第二个冒号后面为步长为负一(负数表示反向输出)
28. 删除英语单词后缀 er ly ing结尾
a = input("请输入英文单词:")
if a[-2:] == 'er' or a[-2:] == 'ly': # a[-2:],从倒数第二个开始到最后
print(a[:-2]) # 从第一个输出 到 倒数第二个
elif a[-3:] =='ing':
print(a[:-3])
else:
print(a)
29. 乒乓球队比赛
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。
有人向队员打听比赛的名单。a说他不和x比,c说他不和x,Z比,请编程 序找出 三队赛手的名单。
ord()函数用于返回对应字符的ASCII码(将字符转为整数)
for a in range(ord('x'),ord('z')+1):
for b in range(ord('x'),ord('z')+1):
if a != b: # 避免队员重复参赛
for c in range(ord('x'),ord('z')+1):
if a != c and b != c:
if(a != ord('x') and c != ord('x') and c != ord('z')):
print ('比赛选手对应名单:\n a -- %s\n b -- %s\n c--%s' % (chr(a),chr(b),chr(c)))
30. 利用递归函数调用方式,将输入的字符以相反的顺序打印输出
def fun(string,len):
if len == 0:
return
print(string[len-1],end="")
fun(string,len-1)
string = input("请输入字符:")
len = len(string)
fun(string,len)
31. 利用递归求年龄
题目:有5个人坐在一起,
问第五个人多少岁?他说比第4个人大2岁。
问第4个人岁数,他说比第3个人大2岁。
问第3个人,又说比第2人大两岁。
问第2个人,说比第一个人大两岁。
最后问第1个人,他说是10岁。请问第五个人多大?
递归见名之意,有一个递(去)的过程和归的过程,要想知道第五个人的年龄首先要知道第四个人的年龄,要想知道第四个人的年龄要知道第三个人的年龄,以此类推,找到第一个人年龄时,再回推。
def fun(a):
if a == 1:
n = 10
else:
n = fun(a - 1) + 2
return n
age = fun(5)
print("第五个人的年龄为:",age)
32. 利用递推求年龄
a = 10
for i in range(4,0,-1):
a = a + 2
print("第五个孩子"+str(a)+"岁")
33. 短信计费
用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个子以内(包括70个字)。
如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信,假设已经知道你当月所发送的短信的次数与字数,试统计一下你当月的短信的总资费。
输入:
整数n,表示当月发送短信的总次数,接着n行每行一个整数,表示每次短信的字数。
输出:
当月短信总自费,单位为元,精确到小数点后1位。
import math # 导入模块
money = 0
a = []
b = int(input("请输入总次数:"))
for i in range(1,b+1):
c = int(input("请输入第"+str(i)+"次的字数:"))
a.append(c)
for x in range (len(a)):
if(a[x] <= 70):
money += 1
if(a[x] > 70):
z = math.ceil(a[x] / 70)
money += z
print(money*0.1)
输出结果如下所示:
34. 登录验证(分支结构)
name = input("请输入用户名:")
pwd = input("请输入密码")
if name == "name":
if pwd == "123456":
print("登录成功!")
else:
print("密码错误!")
else:
print("登录名错误!")
35. 从键盘输出一些字符,挨个把他们写入磁盘文件上,知道输入一个#结束
while True:
txt = input("请输入想要保存的字符,输入#则结果结束")
if txt == "#":
break
else:
with open("a.txt","a")as f:
f.write(txt
36. 将列表转换为字典
list_key = ['a','b','c','d']
list_value = [1,2,3,4]
dict = {}
for i in range(0,len(list_key)):
dict[list_value[i]] = list_key[i]
print(dict)
37. 回文串(下标,分支结构)
正着读和倒着读都一样
[::-1] 从后向前输出元素
str = input("请输入一个字符串:")
str2 = str[::-1]
print(str)
print(str2)
if(str == str2):
print("是回文串")
else:
print("不是回文串")