1. 输入一行大于30位的字符串,分别统计出其中的英文字母、空格、数字和其他字符的个数。
# 方法一
# 获取用户输入的字符串
n = input('请输入字符串: ')# 初始化计数器
a = b = c = d = 0# 遍历字符串中的每个字符
for i in n:# 如果字符是字母,则字母计数器+1if i in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ':a = a + 1# 如果字符是数字,则数字计数器+1elif i in '0123456789':b = b + 1# 如果字符是空格,则空格计数器+1elif i == ' ':c = c + 1# 其他字符则其他字符计数器+1else:d = d + 1print('输入字符串为:', n)
print('字母=%d' % a)
print('数字=%d' % b)
print('空格=%d' % c)
print('其他=%d' % d)
# 方法二
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}")
# 方法三
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 + 1print(f"英文字母的数量为: {english}")
print(f"空格的数量为: {kongge}")
print(f"数字的数量为: {shuzi}")
print(f"其他字符的数量为: {others}")
# 方法四
def function1(s):letters = 0 space = 0 isdigit = 0 others = 0# 遍历字符串中的每个字符for c in s:# 如果字符是字母,则字母计数器+1# 中文汉字会被isalpha判定为true,为了区分可以使用unicodeif c.encode('UTF-8').isalpha():letters += 1# 如果字符是空格,则空格计数器+1elif c.isspace():space += 1# 如果字符是数字,则数字计数器+1elif c.isdigit():isdigit += 1# 其他字符则其他字符计数器+1else:others += 1return letters, space, isdigit, othersinput_str = input("输入字符串:")
letters, space, isdigit, others = function1(input_str)
print(f"输入的字符串中,英文字母的个数为{letters},空格的个数为{space},数字的个数为{isdigit},其他字符的个数为{others}。")
# 方法五
def function2(s):# 初始化计数器letters = 0space = 0isdigit = 0others = 0# 遍历字符串中的每个字符for c in range(len(s)):# 如果字符是小写字母,则字母计数器+1if 'a' <= s[c] <= 'z':letters += 1# 如果字符是大写字母,则字母计数器+1elif 'A' <= s[c] <= 'Z':letters += 1# 如果字符是空格,则空格计数器+1elif s[c] == " ":space += 1# 如果字符是数字,则数字计数器+1elif '0' <= s[c] <= '9':isdigit += 1# 其他字符则其他字符计数器+1else:others += 1return letters, space, isdigit, othersinput_str = input("输入字符串:")
letters, space, isdigit, others = function2(input_str)
print(f"输入的字符串中,英文字母的个数为{letters},空格的个数为{space},数字的个数为{isdigit},其他字符的个数为{others}。")
# 方法六
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, othersdef 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])
# 方法七
import redef split():Str = input('输入一行大于30位的字符串:')# 初始化计数器english = 0 kongge = 0 shuzi = 0 others = 0 # 遍历字符串中的每个字符for i in range(len(Str)):# 使用re.match函数检查当前字符是否为英文字母# re.match函数尝试从字符串的起始位置匹配正则表达式# 匹配成功返回匹配对象,否则返回Noneif 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 += 1else:others += 1return 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. 单位发工资。在控制台输入某职工应发的工资后(包含两位小数),试求各种票额的钞票总张数最少的付款方案(包含五角、两角和一角的纸币,分位四舍五入进位至一角钱)。
# 方法一
# 获取用户输入的工资金额,并尝试将其转换为浮点数
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))
# 方法二
# 获取用户输入的工资金额,并将其转换为浮点数
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}张。")
# 方法三
# 获取用户输入的应发工资,并使用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])))
# 方法四
# 获取用户输入的职工应发工资,并转换为浮点数
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 % 50num += x // 20 # 计算20元钞票的数量x = x % 20num += x // 10 # 计算10元钞票的数量x = x % 10num += x // 5 # 计算5元钞票的数量x = x % 5num += x // 1 # 计算1元钞票的数量x = x % 1# 计算5角、2角和1角的钞票数量
while z != 0:z = int(z)print(z)num += z // 5 # 计算5角钞票的数量z = z % 5num += z // 2 # 计算2角钞票的数量z = z % 2num += z // 1 # 计算1角钞票的数量z = z % 1# 打印总的钞票张数
print("总的钞票张数为:%d" % num)
# 方法五
# 定义一个函数,用于将输入的工资金额分解为整数部分和小数部分
def divide(num):# 将输入的工资金额转换为整数部分integer = int(num)# 计算小数部分并四舍五入到角,因为人民币的分不再使用fraction = round((num - integer) * 10)return integer, fraction ## 返回整数部分和小数部分# 定义一个函数,用于根据整数部分和小数部分计算各种钞票的数量
def salary_num(integer, fraction):num_100 = integer // 100num_50 = integer % 100 // 50num_20 = integer % 100 % 50 // 20num_10 = integer % 100 % 50 % 20 // 10num_5 = integer % 100 % 50 % 20 % 10 // 5num_2 = integer % 100 % 50 % 20 % 10 % 5 // 2num_1 = integer - (100 * num_100 + 50 * num_50 + 20 * num_20 + 10 * num_10 + 5 * num_5 + 2 * num_2)num_05 = fraction // 5num_02 = fraction % 5 // 2num_01 = fraction % 5 % 2print('您将收到' +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()
# 方法六
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 = 0def 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)