首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单ATM算法

简单ATM算法
EN

Stack Overflow用户
提问于 2022-05-18 18:59:09
回答 3查看 140关注 0票数 -1

我有一个简单的ATM算法,给定一个金额,应该交付100张账单、50张账单和20张账单的最低金额。

代码语言:javascript
复制
var amount = 280;
var availableBiils = new[] { 100, 50, 20 };
var usedNumberOfBills = new[] { 0, 0, 0 };

for (var i = 0; i < availableBiils.Count(); i++)
{
    var bill = availableBiils[i];
    while (amount >= bill)
    {
        amount = amount - bill;

        usedNumberOfBills[i] += 1;
    }
}

for (var i = 0; i < usedNumberOfBills.Length; i++)
{
    Console.WriteLine($"{availableBiils[i]}    {usedNumberOfBills[i]}");
}

我的方法不适用于某些情况,例如280、260、240等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-19 08:53:58

这是我刚为你们创造的一个工作样本。

这是处理整个事务的结构:

代码语言:javascript
复制
struct AmountManager
{
    private int amount = 0;
    private List<int> specialAmount = new List<int> { 80, 60 };

    public AmountManager(int amount)
    {
        this.amount = amount;
    }

    List<int> Notes = new List<int> { 100, 50, 20 };

    /// <summary>
    /// Checks how many 100 notes can be used given the amount.
    /// </summary>
    /// <returns>taple representing the number of 100 notes to be used, and the remaining amount</returns>
    public (int Quotient, int Remainder) HundredsUsed() 
        => Math.DivRem(amount, Notes[0]);


    /// <summary>
    /// Checks how many 50 notes can be used given the remaining amount from the HundredsUsed().
    /// </summary>
    /// <returns>taple representing the number of 50 notes to be used, and the remaining amount</returns>
    public (int Quotient, int Remainder) FiftiesUsed()
    {
        if (HundredsUsed().Remainder == 0) 
            return (0, 0);

        if (specialAmount.Contains(HundredsUsed().Remainder))
            return (0, HundredsUsed().Remainder);
        else
            return Math.DivRem(HundredsUsed().Remainder, Notes[1]);
    }

    /// <summary>
    /// Checks how many 20 notes can be used given the remaining amount from the FiftiesUsed().
    /// </summary>
    /// <returns>taple representing the number of 20 notes to be used, and the remaining amount</returns>
    public (int Quotient, int Remainder) TwentiesUsed()
        => (FiftiesUsed().Remainder < Notes[2]) ? (0, 0) :  Math.DivRem(FiftiesUsed().Remainder, Notes[2]);

    public string Print()
        => $@"{Notes[0]}({HundredsUsed().Quotient}), {Notes[1]}({FiftiesUsed().Quotient}), {Notes[2]}({TwentiesUsed().Quotient})";
}

创建一个控制台应用程序,并创建此struct:AmountManager transact = new AmountManager(YourNumber)的一个实例,然后运行transact.Print()打印方法;

我用以下值测试了它:

  • 220 -返回100(2), 50(0), 20(1)
  • 260 -返回100(2), 50(0), 20(3)
  • 270 -返回100(2), 50(1), 20(1)
  • 290 -返回100(2), 50(2), 20(1)
票数 1
EN

Stack Overflow用户

发布于 2022-05-18 19:13:14

你唯一的问题是当你有60或80岁的时候。在这种情况下,你拿了50,剩下的10或30,你无法解决。只要检查一下这个案子。

代码语言:javascript
复制
var amount = 280;
var availableBiils = new[] { 100, 50, 20 };
var usedNumberOfBills = new[] { 0, 0, 0 };

for (var i = 0; i < availableBiils.Count(); i++)
{
    var bill = availableBiils[i];
    while (amount >= bill)
    {
        if (amount == 60)
        {
            amount = 0;
            usedNumberOfBills[2] += 3;
        }
        else if (amount == 80)
        {
            amount = 0;
            usedNumberOfBills[2] += 4;
        }
        else
        {
            amount = amount - bill;
            usedNumberOfBills[i] += 1;
        }
    }
}

for (var i = 0; i < usedNumberOfBills.Length; i++)
{
    Console.WriteLine($"{availableBiils[i]}    {usedNumberOfBills[i]}");
}

如果您的可用账单是众所周知的,您也可以这样做:

代码语言:javascript
复制
var amount = 280;
var availableBiils = new[] { 100, 50, 20 };
var usedNumberOfBills = new[] { 0, 0, 0 };
            
usedNumberOfBills[0] = Math.DivRem(amount, 100, out int pending);

if (pending != 60 && pending != 80)
{
    usedNumberOfBills[1] = Math.DivRem(pending, 50, out amount);
    usedNumberOfBills[2] = amount / 20;
}
else
{
    usedNumberOfBills[2] = pending / 20;
}

for (var i = 0; i < usedNumberOfBills.Length; i++)
{
    Console.WriteLine($"{availableBiils[i]}    {usedNumberOfBills[i]}");
}
票数 1
EN

Stack Overflow用户

发布于 2022-05-18 20:38:03

您的算法只适用于每个金额,如果对于每个账单(不包括最低的),您至少有一个账单,除以整数。对于50,只有较低的账单是20,但50/20=2.5,所以它不是整数。

最简单的解决办法是增加10张钞票。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72294624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档