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)