Python练习题

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("不是回文串")

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值