C#2数组拆分量问题

时间:2010-02-28 11:24:03

标签: c#

我的问题是我有一定的金额,比方说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 .......

提前致谢。

4 个答案:

答案 0 :(得分:4)

如果您想要准确的答案,请不要使用双打。使用小数或整数算术(通过转换为美分)。

我不打算提供完整的源代码,因为这看起来像是家庭作业或学习练习,所以我只是给出一些提示。

要了解您需要某种面额的多少笔记,请使用除法:

int number = (int)(total / sizeOfBill);

从最大的账单开始,向下工作到最小的账单以获得少量的纸币/硬币,否则你最终会得到数千美分硬币而不是几张纸币。

答案 1 :(得分:2)

不是答案:您需要考虑更难的问题版本。

你描述的造币系统有一个很好的特性,当你从剩余的总数中反复“取出”最大面额时,你最终得到的账单/硬币数量最少的解决方案。 FYI是一种通过反复选择最大的东西来运算的算法,称为“贪心算法”;在这种情况下,如果您针对最小数量的账单/硬币进行优化,则贪婪算法会给出最佳结果。

你可以解决硬币系统的问题:

  • 1冠= 60便士(“便士”是“便士”的复数)
  • 1个半冠= 30便士
  • 1弗罗林= 24便士
  • 1先令= 12便士
  • 1 tanner = 6便士

如果您针对最小数量的硬币进行优化,现在进行更改的贪婪算法不起作用。例如,贪婪算法的48便士

  • 取出半冠,留下18便士
  • 取出先令,留下6便士
  • 取出制革商,不留任何东西

三枚硬币。但显然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];
}