题解
ATM取款
1 条题解
-
0
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