top1编程
← 返回题目
题解

ATM取款

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4417 ATM取款(基础)

    解题思路

    取款金额要同时满足两个条件:一是必须是100的倍数,二是不能超过银行卡余额m。如果输入不合法,就要不断重新输入,直到合法才输出Success。这种"至少先输入一次,不合法就再输"的流程,正好用do while实现:do while先执行循环体再判断,保证第一次一定输入,不会出现"还没输入就开始判断"的尴尬。循环里 cin>>n 读入金额,循环条件写成 !(n%1000 && n<=m):只要金额不是100的倍数、或者超过了余额,!(...) 就是true,继续循环重新输入;只有当两个条件都满足时循环才停下。边界情况:余额m最小是1,取款金额n最小是100,100%1000成立,但如果余额只有1,那么100>1,会不断要求重新输入,符合"不能超过余额"的规则;当金额恰好等于余额(比如都是10000)时,n<=m成立,可以取款。

    参考代码

    // 程序用途:模拟ATM取款,金额必须是100的倍数且不超过余额,否则重新输入
    #include <iostream>
    using namespace std;
    
    int main() {
        int m;
        cin >> m;                       // m是银行卡余额
        int n;
        do {
            cin >> n;                   // 输入取款金额n
        } while (!(n % 100 == 0 && n <= m));  // 不合法就继续输入
        cout << "Success" << endl;      // 金额合法,取款成功
        return 0;
    }
    

    复杂度分析

    每次不合法都会重新输入,实际输入次数由用户决定,在题目给出的数据下通常一两次就合法,可以看作常数时间,时间复杂度 O(1);只用了m、n两个变量,额外空间复杂度 O(1)。

    • 1