
背景需求
人工查看最小金额,有遗漏,
【办公类-58-02】20241229汇率计算02(重复数额和不重复数额,小额150元人民币拆分,购买20元以内外币,节省1分钱人民币)-CSDN博客文章浏览阅读735次,点赞9次,收藏13次。【办公类-58-02】20241229汇率计算02(重复数额和不重复数额,小额150元人民币拆分,购买20元以内外币,节省1分钱人民币)
https://blog.csdn.net/reasonsummer/article/details/144833649
通过代码把想要的组合筛选出来
代码展示
from itertools import combinations, combinations_with_replacement
# python 汇率计算(三)包含重复数字和不重复数字,删选最少得金额,最短的组合
# 限定条件:
# 1.人民币:每次只有100元人民币,(超过100的数值也可以计算,但是计算时长很长)
# 2.汇率(450以上:100)的外币(在20元以内拆分买,种类为美元英镑等大于400的欧美货币)
# 3.小于1450的外币需要计算很多组合,程序没有内存会崩盘
# 结果:大部分情况下组合后只少0.01元,最多也就砍掉0.1.
# 选择方式:
# 1.购买次数少,列表只有2-3个数字(外币金额)适宜
# 2.如果几个数字的金额全部相等(有xiqian风险),而且数量大于10次,建议还是选第一条。
# itertools.combinations_with_replacement(重复数字) 和 itertools.combinations(不重复数字)合并。
# 星火讯飞 阿夏
# 20241229
from itertools import combinations, combinations_with_replacement
# 定义汇率和人民币金额20241230
rate = 731.81
country = '美元'
USA = 100
exchange_rate = rate / USA
rmb_amount = 100.04
start=2
gap=1
# 计算可兑换的美元数并取整
usd_amount = int(rmb_amount / exchange_rate)
print(f"{rmb_amount}人民币最多可以换整数 {usd_amount} 美元")
rmb_needed = usd_amount * rate/100
# 创建美元到人民币的映射字典
usd_to_rmb = {i: f"{i * exchange_rate:.2f}" for i in range(1, usd_amount + 1)}
print(usd_to_rmb)
# {1: '7.32', 2: '14.64', 3: '21.95', 4: '29.27', 5: '36.59', 6: '43.91', 7: '51.22', 8: '58.54', 9: '65.86', 10: '73.18', 11: '80.49', 12: '87.81', 13: '95.13', 14: '102.45'}
# 打印结果列表及其对应的人民币总金额,并按字典样式排序
def find_valid_combinations():
result_list = []
small = []
sy = []
zh = []
# 处理不重复元素组合
for r in range(start, len(usd_to_rmb) + 1,gap):
for comb in combinations(range(1, len(usd_to_rmb) + 1), r):
if sum(comb) == usd_amount:
total_rmb = sum(float(usd_to_rmb[num]) for num in comb)
sorted_combination = sorted(comb)
print(sorted_combination)
if f"{total_rmb:.2f}" < f"{usd_amount * exchange_rate:.2f}":
result_list.append({"小于总金额的组合": sorted_combination, "总金额": f"{total_rmb:.2f}"})
c = f"{total_rmb:.2f}"
small.append(c)
d = f"{rmb_amount - total_rmb:.2f}"
sy.append(d)
zh.append(sorted_combination)
# 处理包含重复元素的组合
for r in range(2, len(usd_to_rmb) + 1):
for comb in combinations_with_replacement(range(1, len(usd_to_rmb) + 1), r):
if sum(comb) == usd_amount:
total_rmb = sum(float(usd_to_rmb[num]) for num in comb)
sorted_combination = sorted(comb)
print(sorted_combination)
if f"{total_rmb:.2f}" < f"{usd_amount * exchange_rate:.2f}":
result_list.append({"小于总金额的组合": sorted_combination, "总金额": f"{total_rmb:.2f}"})
c = f"{total_rmb:.2f}"
small.append(c)
d = f"{rmb_amount - total_rmb:.2f}"
sy.append(d)
zh.append(sorted_combination)
# small.sort()
# sy.sort()
return result_list, small, sy, zh
# 调用函数查找有效的组合
valid_combinations, small, sy, zh = find_valid_combinations()
print(small)
print(zh)
# print("small list:", small)
# print("zh list of", zh)
# 打印结果
for combination in valid_combinations:
print(combination)
# 遍历small,比较里面数值最小的元素(可能有多个),读取他们所在的索引位置,然后到zh里面把相应索引位置的子列表提取出来。
min_value = min(small)
min_indices = [index for index, value in enumerate(small) if value == min_value]
min_sublists = [zh[index] for index in min_indices]
print("最小值:", min_value)
# print("最小值对应的索引位置:", min_indices)
print("最小值对应的子列表:", min_sublists)
ce = (float(f"{rmb_needed:.2f}")) -float(min_value)
if small and sy:
print(f"利率 {rate} 时, {rmb_amount} 元人民币最多可以换整数 {usd_amount} {country}, 一笔购买 {rmb_needed:.2f}