【Python】Python 100题 分类入门练习题 - 新手友好

时间:2025-04-12 16:13:35

Python 100题 分类入门练习题 - 新手友好篇 - 整合篇

  • 一、数学问题
    • 题目1:组合数字
    • 题目2:利润计算
    • 题目3:完全平方数
    • 题目4:日期天数计算
    • 题目11:兔子繁殖问题
    • 题目18:数列求和
    • 题目19:完数判断
    • 题目21:猴子吃桃
    • 题目24:分数序列求和
    • 题目25:阶乘累加
    • 题目26:阶乘递归
    • 题目28:年龄推理
    • 题目80:猴子分桃问题
    • 题目83:奇数组合数
    • 题目85:9的倍数验证
    • 题目81:数学等式验证
  • 二、字符串操作
    • 题目13:水仙花数
    • 题目17:字符统计
    • 题目33:列表转字符串
    • 题目62:子串查找
    • 题目89:加密算法
    • 题目96:子串计数
    • 题目98:大小写转换
    • 题目60:字符串长度
    • 题目86:字符串连接
    • 题目31:星期判断
  • 三、列表与字典操作
    • 题目5:三数排序
    • 题目38:矩阵对角线
    • 题目44:矩阵相加
    • 题目68:数组循环移位
    • 题目69:约瑟夫环问题
    • 题目72:创建链表
    • 题目73:反向链表
    • 题目100:列表转字典
    • 题目39:数组插入排序
    • 题目67:数组极值交换
    • 题目79:字符串排序
    • 题目66:数组逆序输出
    • 题目40:数组逆序
  • 四、文件操作
    • 题目97:写入文件
    • 题目98:文件保存
    • 题目99:文件合并排序
  • 五、日期时间处理
    • 题目10:格式化时间
    • 题目16:日期输出
    • 题目95:日期解析
    • 题目91:时间函数示例1
    • 题目92:时间函数示例2
    • 题目93:时间函数示例3
    • 题目94:反应速度测试
  • 六、图形绘制
    • 题目56:圆形绘制
    • 题目57:直线绘制
    • 题目58:方形绘制
    • 题目59:综合图形
    • 题目63:椭圆绘制
    • 题目64:图形组合
    • 题目65:艺术图案
    • 题目23:菱形打印
  • 七、算法与数据结构
    • 题目6:斐波那契数列
    • 题目12:素数筛选
    • 题目20:小球弹跳计算
    • 题目22:比赛名单排列
    • 题目61:杨辉三角生成
    • 题目76:分段函数计算
    • 题目77:循环输出列表
    • 题目78:最大年龄查找
    • 题目84:列表极值交换
    • 题目8:九九乘法表
    • 题目9:延时输出
    • 题目14:质因数分解
    • 题目15:成绩分级
  • 八、位运算
    • 题目51:按位与
    • 题目52:按位或
    • 题目53:按位异或
    • 题目54:位截取
    • 题目55:按位取反
    • 题目82:八进制转十进制
  • 九、其他编程问题
    • 题目27:递归逆序
    • 题目29:数字拆分统计
    • 题目30:回文数判断
    • 题目32:列表逆序输出
    • 题目34:三次输出函数
    • 题目35:文本颜色设置
    • 题目36:素数筛选
    • 题目37:十数排序
    • 题目41:静态变量
    • 题目42:自动变量
    • 题目43:静态变量案例
    • 题目45:数字累加
    • 题目46:平方阈值判断
    • 题目47:变量交换
    • 题目48:数字比较
    • 题目49:匿名函数
    • 题目50:随机数生成
    • 题目71:学生数据IO
    • 题目87:结构体变量传递
    • 题目88:星号打印

一、数学问题

题目1:组合数字

题目1: 有四个数字:1234,能组成多少个互不相同且无重复数字的三位数?各是多少?
# 正常 
num =[]
for a in range(1,5):
    for b in range(1,5):
        for c in range(1,5):
            if (a != b and a!= c and b!=c) :  # if a != b != c  只判断了a不等于b,b不等于c,没有判断a和c的关系 
                num.append(a*100 + b*10 + c)
print(num) 

# 简写: 
x = [1,2,3,4]
num  = [i*100 + j*10 + k for i in x for j in x for k in x if (j != i and k != j and k != i)]

# itertools ,结果需处理 
import itertools
num = [] 
x=[1,2,3,4]
for i in itertools.permutations(x,3):
    num.append(i)
print(num) 

题目2:利润计算

题目2:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,
高于100万元时,超过100万元的部分按1%提成,
从键盘输入当月利润I,求应发放奖金总数?
"""
# 比较简单,直接上答案 
def get_bonus(profit):
    bonus = 0
    if profit <= 100000:
        bonus = profit*0.1   # 不能写百分数7.5%,需转化为小数点
    elif 100000 < profit <= 200000:
        bonus = get_bonus(100000) + (profit-100000)*0.075   
    elif 200000 < profit <= 400000:
        bonus = get_bonus(200000) + (profit-200000)*0.05
    elif 400000 < profit <= 600000:
        bonus = get_bonus(400000) + (profit-400000)*0.03
    elif 600000 < profit <= 1000000:
        bonus = get_bonus(600000) + (profit-600000)*0.015
    else :
        bonus = get_bonus(1000000) + (profit-1000000)*0.01
    return bonus

get_bonus(1000000)

题目3:完全平方数

题目3:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
"""
分析: 
a + 100 = b**2 + 168 = c**2 
168 = c**2 - b**2  
因为b小于c,且b,c都属于168,所以b∈c 

for c in range(1,168):
    for b in range(1,c): 
        if c**2-b**2 == 168:
            a = b**2 - 100
            print(a)

"""

题目4:日期天数计算

题目4:输入某年某月某日,判断这一天是这一年的第几天?
"""
分析:
1. 月份 += 天数;
2. 1,4,9,11月 固定30天,35681012月 固定31, 2月闰年28天,非润29;
3. 考虑系统语言计算差会存在1天误差,所以起始天数为1; 
def get_days(year,month,day):
    days = [31,28,31,30,31,60,31,31,30,31,30,31] 
    sum = 1    # 不能是0,日期从1开始算
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0) :
        days[2] = days[2]+1
    else:
        days[2] = days[2]
    for i in range(month-1):
        sum += days[i]
    return sum 

get_days(2021,3,1)

题目11:兔子繁殖问题

题目11:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
"""
分析: 
每一对新兔子的第3个月会数量裂变,所以这一对兔子第n月生的兔子数为: sum = 2+(n-2)*2; 第二个兔子对也遵循这个逻辑;
month = [1,2,3,4,5,6,7,8...]
rab_1 = [2,2,2,2,2,2,2,2...]
rab_2 = [0,0,2,2,4,6,8,10...]
rab_3 = [0,0,0,2,2,4,6,8...]
rab_4 = [0,0,0,0,2,2,4,6...]
rab_5 = [0,0,0,0,0,2,2,4]
rab_6 = [0,0,0,0,0,0,2,2]
rab_7 = [0,0,0,0,0,0,0,2]
...
汇总 = [2,2,4,6,10,16,26,42...]
从汇总可得,符合斐波那契数列的变式, 从官网看得理解题目和答案不匹配,一对=2 而不是1; 

def rabbits(n):
    if n==1 or n==2:
        return 2
    return rabbits(n-1)+rabbits(n-2)

rabbits(7)

题目18:数列求和

题目18:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制.
""" 
分析:
传入2个参数 
1.总的几个数相加即最长的长度: len = 5 
2.传入的n 是什么:2 22 222 2222 22222 
找规律:
2 = 2*10**0      n = 2= (len-1) 
22 = 2*10**1+2
222 = 2*10**2 + 22
2222 = 2*10**3 + 222
得公式: tmp = n*10**(len-1) + tmp  

def get_sum(n,len):
    sum = 0   # 输出和 
    tmp = 0   # 分解的值 
    for a in range(1,len+1):  # a 浮标 = 幂  
        tmp = n*10**(a-1) + tmp  
        sum += tmp 
    return sum  
get_sum(2,5) 

题目19:完数判断

题目19:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=123.编程找出1000以内的所有完数。
""" 
分析:14先找因子  然后 n = sum(因子和)

for a in range(1, 1000):
    sum = 0
    for b in range(1, a):
        if a % b == 0:
            sum += b
    if sum == a:
        print(a)

题目21:猴子吃桃

题目21:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个.
       第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
       以后每天早上都吃了前一天剩下的一半零一个。
       到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
""" 
分析: 每次1/2+1,倒推即最后剩下的(n+1)*2 = n 前一天的
     即1 1534/2-1 = 766
       2 766/2-1 = 382 
       3 382/2-1 = 190
       4 190/2-1 = 94
       5 94/2 -1 = 46 
       6 46/2 -1 = 22 
       7 22/2 -1 = 10 
       8 10/2 -1 = 4 
       9 4/2  -1 = 1 
def peach(rest):
    rest = 1
    for a in range(1,11):  # 第10天剩1个,实际是第九天吃完后还剩1个  a = 循环天数
        if a <= 9: 
            rest = (rest+1)*2
            a = a + 1
        else:
            break 
    return rest 
peach(10)

题目24:分数序列求和

题目24:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。
""" 
分析:
2 3 5 8 13 21
1 2 3 5 8  1320项之和首先得得到第20个数是什么,然后每个数相加 

def add_sum(n):   # n第几个数
    a = 1    # 分母 
    b = 1    # 分子
    sum = 0  
    for i in range(1,n+1):
        a,b = b,a+b
        sum += b/a 
    return sum 
add_sum(20)  

题目25:阶乘累加

题目25:求1+2!+3!+...+20!的和。
""" 
分析:24题是累加的概念,这里是累乘 

def mul_sum(n):   # n第几个数
    sum = 0
    tmp = 1
    for x in range(1,n+1):  
        tmp *= x
        sum += tmp 
    return sum 
mul_sum(3) 

题目26:阶乘递归

题目26:利用递归方法求5!。
""" 
分析:25题是累乘,26是简单化了
def mul_sum(n):   # n第几个数
    tmp = 1
    for x in range(1,n+1):  
        tmp *= x
    return tmp 
mul_sum(5) 

题目28:年龄推理

题目28:有5个人坐在一起.
       问第五个人多少岁?他说比第4个人大2岁。
       问第4个人岁数,他说比第3个人大2岁。
       问第3个人,又说比第2人大2岁。
       问第2个人,说比第1个人大2岁。
       最后问第一个人,他说是10岁。请问第五个人多大?
""" 
分析: 
递归思想 每前1个人+2岁即可; 
age = 10
for i in range(1,5):
    if i <=4:
        age += 2
    else: 
        age 
print(age)

题目80:猴子分桃问题

题目80:海滩上有一堆桃子,五只猴子来分。
       第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
       第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份. 
       第三、第四、第五只猴子都是这样做的. 
       问海滩上原来最少有多少个桃子?
""" 
分析:21题相似 每5份多14,连续5,此外,要考虑分摊除尽的问题,桃子没法分成小于1; 
def monekys(n):
    if n==num:
        return(4*x)       #最后剩的桃子的数目
    else:
        return(monekys(n+1)*5/4+1)
x=1
while 1:
    count=0
    for i in range(1,num):
        if monekys(i)%4==0 :
            count=count+1
    if count==num-1:
        print("海滩上原来最少有%d个桃子" % int(monekys(0)))
        break
    else:
        x=x+1

题目83:奇数组合数

题目83:求07所能组成的奇数个数。
""" 
分析:
0-78个数,个位奇数为13572位数及以上首位不可以为0;: 组成1位数是4个
    组成2位数是7*4个
    组成3位数是7*8*4个
    组成4位数是7*8*8*4.... 依次类推 

L = []
sum = 0 
for i in range(1,9):  # i等于位数 
    if i == 1 :
        num = 4 
        sum += num
    if i >=2:
        num = 4*7*8**(i-2) 
        sum += num
print(sum)

题目85:9的倍数验证

题目85:输入一个奇数,然后判断最少几个 9 除于该数的结果为整数。
""" 
i = int(input('输入奇数: '))
sum = 9 
while sum % i != 0:
    sum = sum * 10 + 9   # 循环赋值  
    print(sum)

题目81:数学等式验证

题目8180