(一)问题描述
小明刚找到工作,老板人很好,但他老婆很爱逛街。 老板忙的时候,经常让小明帮他逛商场。 小明很无聊,但也不好拒绝。 这不,大甩卖又来了! 老板娘列了一张长长的购物单,每样都有折扣。 小明还有一个怪癖。 除非万不得已,他从不刷卡,直接现金支付。 现在小明很苦恼,请帮他算算完成这次购物需要从ATM取款多少现金。 ATM只能提供100元纸币。 小明想尽可能少的取现金,只要够用就行。 你的任务是计算小明最少需要提取的现金数额。 以下是令人头疼的购物清单,为保护隐私,物品名称被隐藏。
需要说明的是,88折是指按标价的88%计算商场打折,20折是指按80%计算怎样打折扣计算,其余依此类推。 特别是半价按50%计算。 请输入小明要从ATM取款的金额,单位为人民币。
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折
(2) 解决方案
# -*- coding: utf-8 -*-
import math
data = """
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折

**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折
"""
data = data.split() # 分隔符默认为所有的空字符 --> 空格 n t
print(data)
sum = 0
for i in range(0, len(data), 3):
price = float(data[i + 1]) # 取原价
discount = data[i + 2] # 取折扣
if len(discount) == 2:
if discount == "半价":
discount = 0.5
else:
discount = float(discount[:-1]) * 0.1
else:
discount = float(discount[:-1]) * 0.01
sum += price * discount
print(math.ceil(sum/100)*100) # math.ceil() 函数 --> 向上取整到最接近的整数
(三)参考思路
1.将多行字符串分离成一维列表,将总价格值初始化为0
data = data.split()
sum = 0
2、在一维列表中,使用步长3定位****,****下标加1为原价,下标加2为原价享受的优惠
for i in range(0, len(data), 3):
price = float(data[i + 1]) # 取原价
discount = data[i + 2] # 取折扣
3、折扣的长度为3怎样打折扣计算,比如52折,长度为2。长度为2的折扣有两种,一种像20折,一种是半价。 需要根据情况进行处理,处理后计算。 总消耗
if len(discount) == 2:
if discount == "半价":
discount = 0.5
else:
discount = float(discount[:-1]) * 0.1
else:
discount = float(discount[:-1]) * 0.01
sum += price * discount
4.因取款机只能取100的整数倍,所以最后取款金额要四舍五入
print(math.ceil(sum/100)*100) # math.ceil() 函数 --> 向上取整到最接近的整数