【办公类-58-03】20241231汇率计算03(直接筛选结果,重复数额和不重复数额,小额150元人民币拆分,购买20元以内外币,节省1分钱人民币)

背景需求

人工查看最小金额,有遗漏,

【办公类-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} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值