c - 'atm' 模拟器
问题描述
我正在尝试解决这个问题,我需要模拟一种 atm 兑现。该程序将询问 3 种类型的美元钞票并将其存储在 3 个不同的托架中,例如托架 1 = 20;托架 2 = 50;隔间 3 = 100;在程序要求提现金额后,如果可用,最多提供 3 个选项。
For example: cash out amount: U$ 220
A) 2 x U$ 100 + 1 x U$ 20
B) 1 x U$ 100 + 2 x U$ 50 + 1 x U$ 20
C) 4 x U$ 50 + 1 x U$ 20
我正在努力寻找解决 B 和 C 选项的方法,我不知道我是否以我“解决”A 选项的方式进行隧道视野,因为我觉得必须有一种更简单的计算方法
a,b & c 变量是海湾值的冒泡排序
if(cash_out >= a){
left = total % a; //total = cash_out;
if(left == 0){
cont_A = total / a;
} else {
cont_A = total / a;
total = left;
if(total >= b){
left = total % b;
cont_B = total / b;
total = left;
if(total != 0){
cont_C = total / c;
}
} else {
cont_C = total / c;
}
}
} else if(cash_out >= b){
left = total % b;
if(left == 0){
cont_B = total / b;
left = total % b;
if(left == 0){
cont_C = total / c;
}
} else {
cont_B = total / b;
total = left;
if(total >= c){
cont_C = total / c;
}
}
} else {
cont_C = total / c;
}
为了清楚起见,我不是在问,所以有人会为我解决整个问题,我只是想了解我应该如何解决这个问题
代码是我为 A 选项所做的
解决方案
由于您的问题涉及相当小的数字,您可以从蛮力方法开始,即简单地尝试可能范围内的所有组合。
喜欢
#include <stdio.h>
int main(void) {
int bay[3] = {100, 50, 20};
int cash_out = 220;
for (int x = cash_out/bay[0]; x >= 0; --x)
{
for (int y = cash_out/bay[1]; y >= 0; --y)
{
for (int z = cash_out/bay[2]; z >= 0; --z)
{
if (cash_out == (x * bay[0] + y*bay[1] + z*bay[2]))
{
printf("%d %d %d\n", x, y, z);
}
}
}
}
return 0;
}
这将打印:
2 0 1
1 2 1
1 0 6
0 4 1
0 2 6
0 0 11
当然,像上面这样的蛮力方法不是最佳的。因此,您的下一步是优化代码。
第一步是摆脱最里面的 for 循环,因为它完全没有必要。我将把它作为练习留给你(提示:z
可以直接计算)。
第二步是通过考虑第一个循环“使用”的数量来限制第二个 for 循环的范围。同样,我将把它留给你作为练习。
推荐阅读
- javascript - 如何将值传递给子组件 vue 和循环?
- kubernetes - Kubernetes 没有匹配的可配置卷插件
- google-cloud-dataflow - 使用云数据流和 pubsub 进行条件写入
- sql - msAccess 将数据添加到匹配的多行
- sql - 如何在 Microsoft SQL Server 中将昨天的日期插入表中?
- excel - 匹配两列条件格式
- windows - 如何获取可能的 Windows 服务状态列表?
- angular - 角度路线问题
- mysql - 具有多个条件的 MySQL 案例未按预期工作
- javascript - 如何使用 selenium webdriver 处理 html shadow dom?