奇妙货币交易问题 | 豆包MarsCode AI刷题

目标是判断是否能够使用给定面值 V 和规则,按要求支付金额 W。代码的核心思想是基于货币系统的进位规则来判断每一位的支付情况,确保每一位的支付不超过 2 张指定面值的纸币。如果某一位无法满足条件,则返回 NO,否则返回 YES

代码分析

1. 特殊情况处理:V=1

kotlin 复制代码
python
复制代码
if V == 1:
    if W >= 0:
        return "YES"
    else:
        return "NO"
  • V = 1 的情况 :当面值 V 等于 1 时,意味着货币系统的所有纸币面值都是 1。这时,如果 W 是正数,肯定可以用最多 2 张纸币的规则支付。因为无论多少个 1 元纸币,总是可以用不超过 2 张来支付任何正整数金额。代码中没有对 W 为负数的情况进行考虑,因为根据题意,W 应该是正数。

2. 一般情况处理(V > 1)

ini 复制代码
python
复制代码
while W > 0:
    digit = W % V
    if digit <= 2:
        pass  # 不需要进位,直接处理下一位
    elif digit >= V - 2:
        digit -= V  # 向更高位进位
    else:
        return "NO"
    W = (W - digit) // V
  • 进入主循环 :对于一般情况,程序开始从最低位(W % V)开始逐步检查每一位上的支付可能性,直到 W 变为 0。

  • digit = W % V :此行代码获取当前位上需要支付的金额。即,将当前金额 W 对面值 V 取模,得到当前位的"余数"。例如,如果 W = 40199V = 200,则 40199 % 200 = 199,表示当前面值(200)的第 0 位需要支付 199。

  • 判断当前位支付的情况

    • 如果 digit <= 2,说明当前位的支付金额不超过 2 张纸币,这时直接处理,不需要进位,继续检查下一位。
    • 如果 digit >= V - 2,表示当前位的钱大于等于 V - 2,这时可以向更高位进位。因为如果当前位的支付金额接近当前面值的上限(例如 digit = 198,而 V = 200),就意味着可以用 2 张当前面值的纸币支付剩余金额,剩余部分则进位到更高一位。
    • 如果 digit > 2digit < V - 2,说明当前位的钱数无法用不超过 2 张纸币的规则支付,这时返回 "NO"
  • 更新 W :每次检查完当前位的支付后,程序通过 (W - digit) // V 更新 W,即将当前位的支付部分从 W 中去除,剩余的金额继续检查。

3. 返回结果

kotlin 复制代码
python
复制代码
return "YES"
  • 如果经过所有位的检查后,W 被完全支付掉,且每一位的支付都满足不超过 2 张纸币的条件,则返回 "YES"

例子解析

例子 1:V = 10, W = 9

  • 初始 W = 9

  • W % 10 = 9,所以当前位的支付金额是 9。

    • 9 > 2 且 < 8(因为 V - 2 = 8),所以不能支付这一位,返回 "NO"

例子 2:V = 200, W = 40199

  • 初始 W = 40199
  • W % 200 = 199,所以当前位需要支付 199。可以使用 2 张 200 的纸币(即 2 * 200 = 400),进位。
  • 然后继续处理剩余金额,逐步减去已经支付的部分,直到 W 被完全支付。

例子 3:V = 108, W = 50

  • 初始 W = 50
  • W % 108 = 50,当前位需要支付 50。由于 50 > 2 且 < 106,无法满足不超过 2 张纸币的支付要求,因此返回 "NO"

总结

这个解决方案通过模仿进位的方式从低位到高位逐步检查每一位的支付可能性。如果在某一位上无法满足规则,立即返回 "NO",否则继续检查直到支付完成

相关推荐
我明天再来学Web渗透1 天前
“抖音互联网架构分析及高可用系统构建思考”(方向三)| 豆包MarsCode AI刷题
青训营笔记
用户302133066202 天前
第三次刷题 | 豆包MarsCode AI刷题
青训营笔记
用户9105973027707 天前
CSS详解| 豆包MarsCode AI刷题
青训营笔记
huyck7 天前
伴学笔记1|豆包MarsCode AI 刷题
青训营笔记
用户197009008153812 天前
实现一个TodoList | 青训营 x 豆包MarsCode技术训练营
青训营笔记
幻612 天前
小U的相似字符串 | 豆包MarsCode AI刷题
青训营笔记
Grin1 个月前
寻找最大葫芦 | 豆包MarsCode AI刷题
青训营笔记
用户7337855092591 个月前
后端笔记 | go语言进阶与依赖管理
青训营笔记
用户705615332611 个月前
刷题心得(三)| 豆包MarsCode AI刷题
青训营笔记