Python练习题及答案

答案不唯一,仅供参考。下列程序如有问题加我微信:i-aisx

解题方法

  • 穷举法:又称枚举法,是指根据题目的部分条件确定答案的大致范围,然后利用循环结构对所有可能的情况逐一验证。例如:求所有水仙花数、鸡兔同笼等。
  • 迭代法:定义1个或多个变量,然后利用循环结构来修改定义的变量去得到最终的结果。例如:累加求和、阶乘等。与穷举法不同的是,迭代法具有:1、循环体外部变量的定义,2、明确的循环范围或循环数据。
  • 递归法:函数体内调用函数本身,即自己调用自己。可以把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。大大地减少了程序的代码量。例如:阶乘、斐波那契数列等。
    • 递归法有以下两个基本要素:
      1. 确定迭代的方程,例如n!=f(n-1)!*n(n的阶乘等于n-1的阶乘乘以n,f代表递归函数)
      2. 存在限制条件 ,当满足这个限制条件的时候,递归便不再继续。每次递归调用之后都会越来越接近这个 限制条件 。
  • 标志位法:当需要在循环体外得到循环体内的判定结果时(循环是否正常执行完成),可以定义一个标志位变量(通常位flage)进行赋值保存循环体内的结果,然后在循环体外根据该标志位变量进行下一步操作。例如:判断质数、合数等。

基础题目

  1. 求前100项(含100)正整数和?

    s = 0 # 用来保存求和的值
    for i in range(1,101): # 不包含101
        s = s + i
    print("前100项正整数和是:",s)
    
  2. 输出100以内(含100)的所有能被3和7同时整除的数?

    for i in range(1,101):
        if i % 3 == 0 and i % 7 == 0:
            print(i)
    
  3. 用户输入三个整数x,y,z,输出其中的最大值?

    x = int(input("请输入第一个数:"))
    y = int(input("请输入第二个数:"))
    z = int(input("请输入第三个数:"))
    if x > y and x > z:
        print(x)
    elif y > z:
        print(y)
    else:
        print(z)
    
  4. 接收用户输入10个整数,然后利用循环结构求出10个数的最大值

    """写法1:不使用数组"""
    a = []
    for i in range(10):
        a.append(int(input("请输入第"+str(i+1)+"个数字:")))
    max = a[0]
    for i in range(1,len(a)):
        if max<a[i]:
            max = a[i]
    print("最大值是:",max)
    """写法2:使用数组"""
    a = [0]*10
    for i in range(10):
        a[i] = int(input("请输入第"+str(i+1)+"个数字:"))
    max = a[0]
    for i in range(1,len(a)):
        if max<a[i]:
            max = a[i]
    print("最大值是:",max)
    
  5. 用户输入成绩然后输出等级,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示?

    score = int(input('请输入你的成绩:'))
    if score >= 90:
        grade = 'A'
    elif score <= 89 and score >= 60:
        grade = 'B'
    else:
        grade = 'C'
    print("你的等级是",grade)
    
  6. 用户输入一串字符,统计输入字符串中字符‘c’出现的次数?

    s = input("请输入一串字符:")
    n = 0
    for i in s:
        if i == 'c':
            n = n + 1
    print("字符'c'的个数是:",n)
    
  7. 用户输入一串字符,统计输入字符串中小写字母出现的次数?

    • 小写字母的十进制ASCII码范围是97 - 122
    • ord(x):返回ASCII码字符x对应的十进制整数;例如ord(‘a’)的结果是97
    s = input("请输入一串字符:")
    n = 0
    for i in s:
        if 97 <= ord(i) <= 122:
            n = n + 1
    print("小写字母的个数是:",n)
    

数学相关

  1. 用户输入圆的半径,输出圆的面积和周长?(结果保留两位小数)

    r = float(input("请输入圆的半径:"))
    pi = 3.14
    S = round(pi * (r * r),2)
    C = round(2 * pi * r,2)
    print("圆的面积是:",S)
    print("圆的周长是:",C)
    
  2. 输入三角形的三个边a、b、c,输出三角形的面积?三角形的面试公式为 s = p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(pa)(pb)(pc) ,其中 p = (a+b+c) / 2 (结果保留两位小数)

    import math # 导入math包
    a = float(input("请输入第一个边长:"))
    b = float(input("请输入第二个边长:"))
    c = float(input("请输入第三个边长:"))
    p = (a+b+c)/2
    S = math.sqrt(p*(p-a)*(p-b)*(p-c))
    print("三角形的面积是:",round(S,2))
    
  3. 打印出如下图形?

    image-20220326133918778
    """解法1:双层循环"""
    for i in range(1,6): # 控制行
        for j in range(1,i+1): # 控制列
            print("*",end="")
        print()
    """解法2:利用*重复"""
    for i in range(1,6): 
        print("*"*i)
    
  4. 打印出九九乘法表?

    image-20220326134004801
    for i in range(1, 10):
        for j in range(1, i+1):
            print("{}*{}={}\t".format(j,i,i*j),end="") # \t代表制表符,即4个空格
        print() # 换行
    
  5. 本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

    • 起步里程为3公里,起步费10元;
    • 超出3公里的里程,超出部分每公里2元;

    要求:输入里程数,输出车费? (结果保留两位小数)

    a = float(input("请输入里程数:"))
    if a<=3:
        money = 10
    else:
        money = 10+(a-3)*2
    print("车费:",money)
    
  6. 1,2,3,4 这4个数字,能组成多少个互不相同的且无重复的三位数,都是多少?

     n = 0 # 用于保存个数
     for i in range(1,5):
         for j in range(1,5):
             for k in range(1,5):
                 if i != j and i !=k and j !=k:	# 三位数不重复
                     print(i*100+j*10+k)
                     n += 1
     print("不同的三位数个数:",n)
    

特定数字

  1. 判断[2-100]之间有多少个素数,并输出所有素数?

    • 素数一般指质数。 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
    • 1既不属于质数也不属于合数
    """思路1解法:通过设置标志位来判断循环是否正常执行完成"""
    n = 0 # 用于保存素数的个数
    for i in range(2,101):
        flag = True # 默认是质数
        for j in range(2,i-1): # 判断2到本身-1是否还有能被整除的数,有就不是质数
            if i % j == 0:
                flag = False
                break
        if flag:
            print(i)
            n += 1
    print("素数的个数为:",n)
    """思路2解法:利用for……else语法结构"""
     """
     	如果for循环执行break,就不执行else;如果for循环不执行break,就执行else。
     	for……else语法的好处是,我们不用设置标志位就可以判断循环是否正常执行完成。
     """
     n = 0
     for i in range(2,101):
         for j in range(2,i-1): 
             if i % j == 0:
                 break
         else:
             print(i)
             n += 1
     print("素数的个数为:",n)
    
  2. 判断[2-100]之间有多少个合数,并输出所有合数?

    • 合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数
    • 1既不属于质数也不属于合数
    n = 0 # 用于保存合数的个数
    for i in range(2,101):
        flag = False # 默认不是合数
        for j in range(2,i-1): # 判断2到本身-1是否还有能被整除的数,有就是合数
            if i % j == 0:
                flag = True
                break
        if flag:
            print(i)
            n += 1
    print("合数的个数为:",n)
    
  3. 判断完全平方数?所谓"完全平方数"是指若一个数能表示成某个整数的平方的形式?例如:16,64等

    import math
    num = int(input("请输入一个数字:"))
    q = math.sqrt(num)
    if q == int(q): # 判断一个数开平方后是否还是整数
        print("是")
    else:
        print("不是")
    
  4. 判断回文数?所谓“回文数”是指一个数字正着多和反着读是一样的,例如:12321,123321等

    a = input("请输入一个数字:") # 直接接收字符串
    flag = True # 默认是回文数
    for i in range(int(len(a)/2)):
        if a[i] != a[-(i+1)]:
            flag = False
            break
    if flag:
        print("是回文数")
    else:
        print("不是回文数")
    
  5. 求水仙花数?所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=13+53+33

    """思路1解法:使用三层for循环,分别对应百位、十位、个位"""
    for x in range(1,10): # 百位,百位不可能为0
        for y in range(0,10): # 十位
            for z in range(0,10): # 个位
                num = x*100+y*10+z # 得到这个数字
                if num == x**3 + y**3 + z**3: # 判断是否等于各位数字立方和
                    print(num)
    """思路2解法:使用一层for循环,分离出数字的百位、十位、个位"""
    for num in range(100,1000):
        x = int(num/100) # 取出百位
        y = int((num-x*100)/10) # 取出十位
        z = num%10 # 取出个位
        if num == pow(x,3) + pow(y,3) + pow(z,3):
            print(num)
    
  6. 求阶乘?

    • n!=n*(n-1)*(n-2)……*1,例如:5!= 5*4*3*2*1 = 120
    """递归法,自己调用自己"""
    n = int(input("请输入一个数字:"))
    def jc(n):
        if n == 1:
            return 1
        else:
            return n * jc(n-1)
    print("{}的阶乘是:{}".format(n,jc(n)))
    
    """迭代法,循环结构"""
    n = int(input("请输入一个数字:"))
    t = 1
    for i in range(1,n+1):
        t = t * i
    print("{}的阶乘是:{}".format(n,t))
    
  7. 求[1-20]的阶乘?

    • n! = (n-1)!* n,n的阶乘等于n乘以n-1的阶乘
    t = 1 # 每一项阶乘
    for i in range(1,21):
        t = t * i # 每一项的阶乘都等于其本身*上一项的阶乘
        print("{}的阶乘是:{}".format(i,t))
    
  8. 求[1-20]的阶乘和?

    t = 1 # 每一项阶乘
    s = 0 # 保存阶乘和
    for i in range(1,21):
        t *= i
        s += t
    print("阶乘和是:",s)
    
  9. 求两个数的最小公倍数?

    • 两个数a、b的最小公倍数最小是max(a,b),最大是a*b
    x = int(input("请输入第一个数:"))
    y = int(input("请输入第二个数:"))
    if x>y:
        max  = x
    else:
        max = y
    for i in range(max,(x*y)+1):
        if i % x == 0 and i % y == 0:
            print("最大公倍数是:",i)
            break
    
  10. 求两个数的最大公因数?

    • 两个数a、b的最大公因数最大是min(a,b),最小值是1
    x = int(input("请输入第一个数:"))
    y = int(input("请输入第二个数:"))
    if x<y:
        min  = x
    else:
        min = y
    for i in range(min,0,-1):
        if x % i == 0 and y % i == 0:
            print("最大公因数是:",i)
            break
    
  11. 接收一个整数,输出该数的所有因子。例如6的因子有1,2,3

    • 一个数的因子就代表能被这个数整除,整除即余数为0
    n = int(input("请输入一个数:"))
    for i in range(1,int(n/2)+1): # 一个数的最大因子是它的1/2,例如100最大50,101最大50
        if n % i == 0:
            print(i)
    
  12. 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3,编程找出2-1000以内的所有完数。

    for i in range(2,1001):
        s = 0 # 保存因子和
        for j in range(1,int(i/2)+1): # 一个数的最大因子是它的1/2,例如100最大50,101最大50
            if i % j == 0:
                s = s + j
        if i == s: # 数等于因子之和
            print(i)
    
  13. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

    • 下一个数的分子等于上一个数的分子+分母,下一个数的分母等于上一个数的分子
    i = 2 # 分子
    j = 1 # 分母
    s = 0 # 保存求和结果
    for i in range(20):
        s = s + i/j
        i,j = i+j,i
    
  14. 求s=2+22+222+2222+2……2的值,几个数相加由键盘控制。

    • 每一个数等于前一个数乘10加2,例如2222=222*10+2
    n = int(input("请输入一个数字:"))
    a = 0
    s = 0
    for i in range(n):
        a = a*10+2
        s = s + a
    print(s)
    

古典问题

  1. 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问一年后的兔子总数为多少?

    • 翻译:求出斐波那契数列的第12项?(斐波那契数列:0、1、1、2、3、5、8、13、21、34、……,自第三项开始,每一项都是前两项之和)
    • 思路:迭代或递归
    """递归法,自己调用自己"""
    def fib(n):
        if n == 1 or n == 2:
            return 1
        else:
            return fib(n-1)+fib(n-2)
    print(fib(10))
    """迭代法,循环结构"""
    f1 = f2 = 1
    for i in range(3,11):
        f1,f2 = f2,f1+f2
    print(f2)
    
  2. 我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

    • 翻译:公鸡一只5元,母鸡一只3元,小鸡三只1元,用100元买了100只鸡,问公鸡、母鸡、小鸡各有多少只?
    • 思路:穷举法
    for x in range(1,21): # 公鸡最多100/5,即20个
        for y in range(1,34): # 母鸡最多33个
            z = 100-x-y
            if x*5 + y*3 + z/3 == 100:
                print("鸡翁:",x,"鸡母:",y,"鸡雏:",z)
    
  3. 大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”

    • 翻译:鸡兔同笼,共有头35,脚94,求鸡、兔各有多少只?
    • 思路:穷举法
    for x in range(1,35): # 鸡最多34个
        y = 35-x
        if  x*2+y*4 == 94:
            print("雉:",x,"兔:",y)
    
  4. 南北朝时期的数学著作《孙子算经》中记录了一个“物不知数”题目。这道“物不知数”的题目是这样的: “今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?(求出最小的一个符合条件的数字即可)

    • 翻译:有一个数,用3除余2,用5除余3,用7除余2。求这个数的最小值?
    • 思路:本题不知道循环次数,适合while
    i = 1
    while True:
        if i % 3 == 2 and i % 5 == 3 and i % 7 == 2:
            print(i)
            break
        i = i + 1
    

猜你喜欢

转载自blog.csdn.net/qq_40910781/article/details/123756860