我的问题是我有一定的金额,比方说552。 我想把它分成硬币/账单=>因此结果将是例如1x500 1x 50 1x 2
我为此制作了2个数组:
double[] CoinValue = {500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
uint[] CoinAmount = new uint[CoinValue.Length];
我的问题是我如何“告诉”数组在countAmount数组中500的值应为1。=> 1.所以,如果我有1000个阵列,CoinAmount数组就会知道它需要保持2作为值(2x500 = 1000)。
所以我的最终结果将是这样的,给出硬币/账单的数量: 1 x 500 1 x 50 1 x 2 .......
提前致谢。
答案 0 :(得分:4)
如果您想要准确的答案,请不要使用双打。使用小数或整数算术(通过转换为美分)。
我不打算提供完整的源代码,因为这看起来像是家庭作业或学习练习,所以我只是给出一些提示。
要了解您需要某种面额的多少笔记,请使用除法:
int number = (int)(total / sizeOfBill);
从最大的账单开始,向下工作到最小的账单以获得少量的纸币/硬币,否则你最终会得到数千美分硬币而不是几张纸币。
答案 1 :(得分:2)
不是答案:您需要考虑更难的问题版本。
你描述的造币系统有一个很好的特性,当你从剩余的总数中反复“取出”最大面额时,你最终得到的账单/硬币数量最少的解决方案。 FYI是一种通过反复选择最大的东西来运算的算法,称为“贪心算法”;在这种情况下,如果您针对最小数量的账单/硬币进行优化,则贪婪算法会给出最佳结果。
你可以解决硬币系统的问题:
如果您针对最小数量的硬币进行优化,现在进行更改的贪婪算法不起作用。例如,贪婪算法的48便士
三枚硬币。但显然48便士是两个弗罗林,只有两个硬币。
你能想出一个处理这个造币系统的算法,并为每个问题提供最少数量的硬币吗?
(请注意,十进制前英国造币系统既不适用于十进制也不适用于双重算术;全部以整数运行!)
答案 2 :(得分:1)
请为此使用decimal
; double
很少适用于金钱类型:
double value = 0.3;
value -= 0.1;
value -= 0.1;
value -= 0.1;
Console.WriteLine(value); //**not** zero
无论如何,一个非常粗略的方法(也假设硬币按降序排序,所有值都是非负的)低于。如果你没有最低价值的硬币(即你有0.5M和0.2M但没有0.1M,需要发出0.8M - 这需要4x0.2M,而不是0.5M + 0.2M +(该死的),这会变得更加棘手)
decimal value = 10023.23M;
decimal[] CoinValue = { 500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5M, 0.2M, 0.1M, 0.05M, 0.02M, 0.01M };
int[] counts = new int[CoinValue.Length];
for (int i = 0; i < CoinValue.Length; i++) {
decimal v = CoinValue[i];
while (value >= v) {
counts[i]++;
value -= v;
}
}
for (int i = 0; i < CoinValue.Length; i++) {
if (counts[i] > 0) {
Console.WriteLine(CoinValue[i] + "\t" + counts[i]);
}
}
Console.WriteLine("Untendered: " + value);
答案 3 :(得分:0)
鉴于你的阵列...当然也适用于小数。
double[] CoinValue = { 500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01 };
uint[] result = new uint[CoinValue.Length];
double ammount = 552.5;
double remaining = ammount;
for (int i = 0; i < CoinValue.Length; ++i) {
result[i] = (uint) (remaining / CoinValue[i]);
if (result[i] > 0)
remaining = remaining % CoinValue[i];
}