Python练习2

1. 输入一行大于30位的字符串,分别统计出其中的英文字母、空格、数字和其他字符的个数。

python 复制代码
# 方法一
# 获取用户输入的字符串
n = input('请输入字符串: ')

# 初始化计数器
a = b = c = d = 0

# 遍历字符串中的每个字符
for i in n:
    # 如果字符是字母,则字母计数器+1
    if i in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ':
        a = a + 1
    # 如果字符是数字,则数字计数器+1
    elif i in '0123456789':
        b = b + 1
    # 如果字符是空格,则空格计数器+1
    elif i == ' ':
        c = c + 1
    # 其他字符则其他字符计数器+1
    else:
        d = d + 1

print('输入字符串为:', n)
print('字母=%d' % a)
print('数字=%d' % b)
print('空格=%d' % c)
print('其他=%d' % d)
python 复制代码
# 方法二
str = input("输入字符串:")

j = 0  # 统计字母的数量
k = 0  # 统计空格的数量
m = 0  # 统计数字的数量
p = 0  # 统计其他字符的数量

# 遍历字符串中的每个字符
for i in range(0, len(str)):
    # 检查字符是否为字母(大写或小写)
    if((str[i] >= 'A' and str[i] < 'Z') or (str[i] >= 'a' and str[i] <= 'z')):
        j = j + 1
    # 检查字符是否为空格
    elif str[i] == ' ':
        k = k + 1
    # 检查字符是否为数字
    elif (str[i] >= '0') and (str[i] <= '9'):
        m = m + 1
    # 其他字符
    else:
        p = p + 1

# 输出统计结果
print(f"字母的数量为: {j}")
print(f"空格的数量为: {k}")
print(f"数字的数量为: {m}")
print(f"其他字符的数量为: {p}")
python 复制代码
# 方法三
str_input = input("输入字符串:")

# 初始化计数器
english = 0
kongge = 0 
shuzi = 0 
others = 0

# 遍历字符串中的每个字符
for n in str_input: 
    # 检查字符是否为英文字母(大写或小写)
    if (n >= 'a' and n <= 'z') or (n >= 'A' and n <= 'Z'):
        english = english + 1
    # 检查字符是否为空格
    elif n == ' ':
        kongge = kongge + 1
    # 检查字符是否为数字
    elif n in '0123456789':
        shuzi = shuzi + 1
    # 其他字符
    else:
        others = others + 1

print(f"英文字母的数量为: {english}")
print(f"空格的数量为: {kongge}")
print(f"数字的数量为: {shuzi}")
print(f"其他字符的数量为: {others}")
python 复制代码
# 方法四
def function1(s):
    letters = 0 
    space = 0 
    isdigit = 0 
    others = 0

    # 遍历字符串中的每个字符
    for c in s:
        # 如果字符是字母,则字母计数器+1
        # 中文汉字会被isalpha判定为true,为了区分可以使用unicode
        if c.encode('UTF-8').isalpha():
            letters += 1
        # 如果字符是空格,则空格计数器+1
        elif c.isspace():
            space += 1
        # 如果字符是数字,则数字计数器+1
        elif c.isdigit():
            isdigit += 1
        # 其他字符则其他字符计数器+1
        else:
            others += 1

    return letters, space, isdigit, others

input_str = input("输入字符串:")
letters, space, isdigit, others = function1(input_str)
print(f"输入的字符串中,英文字母的个数为{letters},空格的个数为{space},数字的个数为{isdigit},其他字符的个数为{others}。")
python 复制代码
# 方法五
def function2(s):
    
    # 初始化计数器
    letters = 0
    space = 0
    isdigit = 0
    others = 0

    # 遍历字符串中的每个字符
    for c in range(len(s)):
        # 如果字符是小写字母,则字母计数器+1
        if 'a' <= s[c] <= 'z':
            letters += 1
        # 如果字符是大写字母,则字母计数器+1
        elif 'A' <= s[c] <= 'Z':
            letters += 1
        # 如果字符是空格,则空格计数器+1
        elif s[c] == " ":
            space += 1
        # 如果字符是数字,则数字计数器+1
        elif '0' <= s[c] <= '9':
            isdigit += 1
        # 其他字符则其他字符计数器+1
        else:
            others += 1
            
    return letters, space, isdigit, others

input_str = input("输入字符串:")
letters, space, isdigit, others = function2(input_str)
print(f"输入的字符串中,英文字母的个数为{letters},空格的个数为{space},数字的个数为{isdigit},其他字符的个数为{others}。")
python 复制代码
# 方法六
import re  # 导入re库,re库提供了正则表达式的支持

def fun1(str_input):
    # 使用re.findall函数用于查找字符串中所有与正则表达式匹配的子串,并返回一个列表
    # [a-zA-Z]表示匹配任意一个英文字母,无论大小写
    letters = len(re.findall(r'[a-zA-Z]', str_input))
    # \s表示匹配任何空白字符,包括空格、制表符、换行符等
    spaces = len(re.findall(r'\s', str_input))
    # [0-9]表示匹配任意一个阿拉伯数字
    digits = len(re.findall(r'[0-9]', str_input))
    # 计算其他字符的数量,即总长度减去字母、空格和数字的总和
    others = len(str_input) - (letters + spaces + digits)

    return letters, spaces, digits, others

def fun2(str_input):
    # 返回字符串中所有英文字母的列表
    letters = re.findall(r'[a-zA-Z]', str_input)
    # 返回字符串中所有空格字符的列表
    spaces = re.findall(r'\s', str_input)
    # 返回字符串中所有数字的列表
    digits = re.findall(r'[0-9]', str_input)
    # 计算其他字符的数量,即总长度减去字母、空格和数字列表的长度之和
    others = len(str_input) - len(letters) - len(spaces) - len(digits)

    return len(letters), len(spaces), len(digits), others  # 返回各类字符的数量

# 提示用户输入一个长度大于30的字符串
print("请输入一个长度大于30的字符串")
while True:
    str_input = input()  # 获取用户输入
    if len(str_input) <= 30:
        print("长度不超过30请重输")  # 如果长度不超过30,则提示用户重新输入
    else:
        break  # 如果长度超过30,则跳出循环

ans1 = fun1(str_input)
ans2 = fun2(str_input)

# 输出fun1函数的结果
print('字母个数:', ans1[0])
print('空格个数:', ans1[1])
print('数字个数:', ans1[2])
print('其他字符个数:', ans1[3])

# 输出fun2函数的结果
print('\n字母个数:', ans2[0])
print('空格个数:', ans2[1])
print('数字个数:', ans2[2])
print('其他字符个数:', ans2[3])
python 复制代码
# 方法七
import re

def split():
    Str = input('输入一行大于30位的字符串:')
    
    # 初始化计数器
    english = 0 
    kongge = 0  
    shuzi = 0 
    others = 0 
    
    # 遍历字符串中的每个字符
    for i in range(len(Str)):
        # 使用re.match函数检查当前字符是否为英文字母
        # re.match函数尝试从字符串的起始位置匹配正则表达式
        # 匹配成功返回匹配对象,否则返回None
        if re.match('[a-zA-Z]', Str[i]):
            english += 1
        # \s匹配任何空白字符,如空格、制表符、换行符等
        elif re.match('\s', Str[i]):
            kongge += 1
        # \d匹配任意一个阿拉伯数字,等同于[0-9]
        elif re.match('\d', Str[i]):
            shuzi += 1
        else:
            others += 1

    return english, kongge, shuzi, others

# 调用split函数并输出结果
english_count, space_count, digit_count, other_count = split()
print(f"英文字母的数量为: {english_count}")
print(f"空格的数量为: {space_count}")
print(f"数字的数量为: {digit_count}")
print(f"其他字符的数量为: {other_count}")

2. 单位发工资。在控制台输入某职工应发的工资后(包含两位小数),试求各种票额的钞票总张数最少的付款方案(包含五角、两角和一角的纸币,分位四舍五入进位至一角钱)。

python 复制代码
# 方法一
# 获取用户输入的工资金额,并尝试将其转换为浮点数
money = input('输入职工应发的工资(包含两位小数):')

# 初始化钞票总张数变量
m = 0

# 思路:从大到小计算各种面额的钞票张数,累加到总张数中
# 首先计算100元钞票的张数
n1 = float(money) / 100  # 将金额除以100,计算100元钞票的张数
m += int(n1)  # 累加到总张数中,使用int()确保张数是整数
# 更新未计算的金额
money = float(money) % 100

# 接着计算50元钞票的张数
n2 = float(money) / 50
m += int(n2)
money = float(money) % 50

# 计算20元钞票的张数
n3 = float(money) / 20
m += int(n3)
money = float(money) % 20

# 计算10元钞票的张数
n4 = float(money) / 10
m += int(n4)
money = float(money) % 10

# 计算5元钞票的张数
n5 = float(money) / 5
m += int(n5)
money = float(money) % 5

# 计算1元钞票的张数
n6 = float(money) / 1
m += int(n6)
money = float(money) % 1

# 计算5角钞票的张数
n7 = float(money) / 0.5
m += int(n7)
money = float(money) % 0.5

# 计算2角钞票的张数
n8 = float(money) / 0.2
m += int(n8)
money = float(money) % 0.2

# 计算1角钞票的张数
n9 = float(money) / 0.1
m += int(n9)

print('钞票总张数最小的方案(总数为%d):'
      '100元张数:%d,50元张数:%d,20元张数:'
      '%d,10元张数:%d,5元张数:%d,1元张数:%d,5'
      '角张数:%d,2角张数:%d,1角张数:'
      '%d' % (m, n1, n2, n3, n4, n5, n6, n7, n8, n9))
python 复制代码
# 方法二
# 获取用户输入的工资金额,并将其转换为浮点数
n = float(input('请输入该职工应发的工资数:\n'))

# 初始化钞票数量列表,代表从100元到0.1元面额的钞票各自的数量
list_ = [0] * 10  # 使用列表推导式初始化长度为10的列表,所有元素为0

# 代表钞票面额,从100元到0.1元
money = [10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10]

# 将工资数乘以100,转换为整数,方便计算
i = int(n * 100)

num = 0  # 钞票总张数

# 四舍五入处理
sc = i % 10
if sc > 5:  # 如果余数大于5,则进位
    i = i + (10 - sc)
else:  # 否则,直接减去余数
    i = i - sc

# 计算所需钞票数量
for c in range(len(money)):
    list_[c] = i // money[c]  # 计算当前面额的钞票数量
    i = i % money[c]  # 更新剩余金额
    num += list_[c]  # 累加到总张数

    # 打印当前面额的钞票数量
    print(f"需要{money[c] / 100}元的钞票{list_[c]}张。\n")

# 打印总钞票张数
print(f"需要钞票总共{num}张。")
python 复制代码
# 方法三
# 获取用户输入的应发工资,并使用eval函数尝试将输入转换为浮点数
m = eval(input("请输入应发工资:"))
# 将工资四舍五入到小数点后两位
MONEY = round(m, 2)
# 计算最大面额(100元)钞票的数量
maxcnt = int(MONEY / 100)
# 初始化一个列表,用于存储每种钞票的数量,初始值都为0
lis = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 定义一个列表,包含从大到小的钞票面额,单位是元
moneylis = [100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1]

# 从大到小计算每种钞票的数量
for i in range(0, 10):
    # 使用地板除计算当前面额的钞票数量
    lis[i] = MONEY // moneylis[i]
    # 计算剩余需要支付的金额
    MONEY -= moneylis[i] * lis[i]
    # 如果剩余金额小于等于0,则不需要再计算更小面额的钞票
    if MONEY <= 0:
        break

# 打印各种钞票的数量
print("各种钞票的数量为:")
for i in range(0, 10):
    # 打印当前面额的钞票数量,将浮点数转换为整数
    print(str(moneylis[i]) + "元:" + str(int(lis[i])))
python 复制代码
# 方法四
# 获取用户输入的职工应发工资,并转换为浮点数
x = float(input("职工应发的工资为(两位小数):"))
num = 0
# 将工资放大100倍,方便后面计算分的余数
y = 100 * x

# 求余看个位数,判断小数第二位是否需要进位
temp = y % 10
if temp >= 5:
    # 第二位小数大于等于5就进位
    x = (y - temp) / 100 + 0.1
else:
    # 第二位小数小于5就舍去
    x = (y - temp) / 100

# 打印处理后的工资,即四舍五入后的工资
print(x)

# 计算放大100倍后的工资模10的结果,用于确定5角、2角和1角的余数
z = (10 * x) % 10
print(z)

# 将处理后的工资转换为整数,开始计算各种钞票的数量
while x != 0:
    x = int(x)
    print(x)
    # 使用地板除和取余操作计算每个面额的钞票数量
    num += x // 100  # 计算100元钞票的数量
    x = x % 100      # 更新剩余金额

    num += x // 50   # 计算50元钞票的数量
    x = x % 50

    num += x // 20   # 计算20元钞票的数量
    x = x % 20

    num += x // 10   # 计算10元钞票的数量
    x = x % 10

    num += x // 5    # 计算5元钞票的数量
    x = x % 5

    num += x // 1    # 计算1元钞票的数量
    x = x % 1

# 计算5角、2角和1角的钞票数量
while z != 0:
    z = int(z)
    print(z)
    num += z // 5   # 计算5角钞票的数量
    z = z % 5

    num += z // 2   # 计算2角钞票的数量
    z = z % 2

    num += z // 1   # 计算1角钞票的数量
    z = z % 1

# 打印总的钞票张数
print("总的钞票张数为:%d" % num)
python 复制代码
# 方法五
# 定义一个函数,用于将输入的工资金额分解为整数部分和小数部分
def divide(num):
    # 将输入的工资金额转换为整数部分
    integer = int(num)
    # 计算小数部分并四舍五入到角,因为人民币的分不再使用
    fraction = round((num - integer) * 10)
    return integer, fraction  ## 返回整数部分和小数部分

# 定义一个函数,用于根据整数部分和小数部分计算各种钞票的数量
def salary_num(integer, fraction):
    num_100 = integer // 100
    num_50 = integer % 100 // 50
    num_20 = integer % 100 % 50 // 20
    num_10 = integer % 100 % 50 % 20 // 10
    num_5 = integer % 100 % 50 % 20 % 10 // 5
    num_2 = integer % 100 % 50 % 20 % 10 % 5 // 2
    num_1 = integer - (100 * num_100 + 50 * num_50 + 20 * num_20 + 10 * num_10 + 5 * num_5 + 2 * num_2)
    num_05 = fraction // 5
    num_02 = fraction % 5 // 2
    num_01 = fraction % 5 % 2

    print('您将收到' +
          str(num_100) + '张¥100,' +
          str(num_50) + '张¥50,' +
          str(num_20) + '张¥20,' +
          str(num_10) + '张¥10,' +
          str(num_5) + '张¥5,' +
          str(num_2) + '张¥2,' +
          str(num_1) + '张¥1和' +
          str(num_05) + '张五角,' +
          str(num_02) + '张两角,' +
          str(num_01) + '张一角的钞票。')

# 主函数
def main():
    # 获取用户输入的工资,并转换为浮点数
    salary = float(input("您应得的工资为:"))
    # 调用divide函数将工资分解成整数部分和小数部分
    salary_integer, salary_fraction = divide(salary)
    # 调用salary_num函数计算并打印各种钞票的数量
    salary_num(salary_integer, salary_fraction)

# 判断是否为直接运行该模块,如果是,则执行主函数
if __name__ == "__main__":
    main()
python 复制代码
# 方法六
from decimal import Decimal
# Decimal类是decimal模块提供的一个类,用于十进制浮点数运算
# 可以避免浮点数运算中的精度问题

# 输入金额并进行四舍五入到一位小数
w1 = float(Decimal(input('输入金额:')).quantize(Decimal("0.1"), rounding="ROUND_HALF_UP"))
# ROUND_HALF_UP 表示四舍五入

# 定义钞票面额
notes = (0.1, 0.2, 0.5, 1, 5, 10, 20, 50, 100)

# 计算需要多少张钞票
count = 0

def f(w1, notes):
    # 创建空列表存储每种面额的钞票数量
    counts = []
    
    # 从高面额到低面额遍历
    for i in range(len(notes) - 1, -1, -1):
        # 计算当前面额要用多少张钞票
        counts.append(w1 // notes[i])
        
        # 计算剩余金额
        temp = (w1 // notes[i])  # 取整,得到可以使用的钞票数量
        w1 -= temp * notes[i]    # 从总金额中减去已使用的金额
        
        # 确保w1的值保留一位小数
        w1 = float(Decimal(w1).quantize(Decimal("0.1"), rounding="ROUND_HALF_UP"))
    
    # 返回面额和对应的钞票数量,顺序反转
    return zip(notes, reversed(counts))
    #  zip函数用于接受可迭代对象(如列表、元组),将其"压缩"成一个元组的迭代器

# 打印每种面额和对应的钞票数量
for x in f(w1, notes):
    print(x)
    count += x[1]
print(w1, '最少钞票数: ', count)
相关推荐
mqiqe8 分钟前
Elasticsearch 分词器
python·elasticsearch
qystca15 分钟前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱16 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子21 分钟前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
努力进修25 分钟前
“探索Java List的无限可能:从基础到高级应用“
java·开发语言·list
不去幼儿园1 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Ajiang28247353042 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空2 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou6 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot