我有一个简单的ATM算法,给定一个金额,应该交付100张账单、50张账单和20张账单的最低金额。
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等。
发布于 2022-05-19 08:53:58
这是我刚为你们创造的一个工作样本。
这是处理整个事务的结构:
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)发布于 2022-05-18 19:13:14
你唯一的问题是当你有60或80岁的时候。在这种情况下,你拿了50,剩下的10或30,你无法解决。只要检查一下这个案子。
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]}");
}如果您的可用账单是众所周知的,您也可以这样做:
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]}");
}发布于 2022-05-18 20:38:03
您的算法只适用于每个金额,如果对于每个账单(不包括最低的),您至少有一个账单,除以整数。对于50,只有较低的账单是20,但50/20=2.5,所以它不是整数。
最简单的解决办法是增加10张钞票。
https://stackoverflow.com/questions/72294624
复制相似问题