C++提供最低零钱的计划不适用于最低面额

C++ program to give minimum amount of change doesn't work for lowest denominations

本文关键字:计划 不适用 适用于 零钱 C++      更新时间:2023-10-16

这样做的目的是在纸币/硬币的最小数量中给出零钱的数量。到目前为止,我的代码可以很好地处理所有值,除了那些包含2p或1p硬币的值。12.33给出1英镑10英镑、1英镑2英镑、1英镑20便士、1英镑10便士和1英镑2便士,但没有1便士。我也试过2p,也就是1个1p, 1p等于0个硬币。我无法找出这些特定值有什么问题,因为每种面额的代码都是相同的。

#include <iostream>
using namespace std;
int main()
{
  float change;
  int fifty = 0;
  int twenty = 0;
  int ten = 0;
  int five = 0;
  int two = 0;
  int one = 0;
  int fiftyp = 0;
  int twentyp = 0;
  int tenp = 0;
  int fivep = 0;
  int twop = 0;
  int onep = 0;
  cout << "Please enter the amount of change given:n";
  cin >> change;
  while ( change >= 50)
    {
      fifty++;
      change -= 50;
    }

  while ( change >= 20)
    {
      twenty++;
      change -= 20;
    }

  while ( change >= 10)
    {
      ten++;
      change -= 10;
    }

  while ( change >= 5)
    {
      five++;
      change -= 5;
    }

  while ( change >= 2)
    {
      two++;
      change -= 2;
    }

  while ( change >= 1)
    {
      one++;
      change -= 1;
    }

  while ( change >= 0.5)
    {
      fiftyp++;
      change -= 0.5;
    }

  while ( change >= 0.2)
    {
      twentyp++;
      change -= 0.2;
    }

  while ( change >= 0.1)
    {
      tenp++;
      change -= 0.1;
    }

  while ( change >= 0.05)
    {
      fivep++;
      change -= 0.05;
    }

  while ( change >= 0.02)
    {
      twop++;
      change -= 0.02;
    }

  while ( change >= 0.01)
    {
      onep++;
      change -= 0.01;
    }

    cout << "Give " << fifty << " £50 notes.n"; 
    cout << "Give " << twenty << " £20 notes.n";
    cout << "Give " << ten << " £10 notes.n";
    cout << "Give " << five << " £5 notes.n";
    cout << "Give " << two << " £2 coins.n";
    cout << "Give " << one << " £1 coins.n";
    cout << "Give " << fiftyp << " 50p coins.n";
    cout << "Give " << twentyp << " 20p coins.n";
    cout << "Give " << tenp << " 10p coins.n";
    cout << "Give " << fivep << " 5p coins.n";
    cout << "Give " << twop << " 2p coins.n";
    cout << "Give " << onep << " 1p coins.n";
    return 0;
}

问题是浮点数学。考虑在程序末尾添加以下行:

cout << "Change left: " << change << 'n';

12.33作为输入运行程序的结果是:

Change left: 0.00999992

显然这小于0.01。虽然你可以尝试添加模糊因子来处理与完全数的"小"偏差,但通常最好使用整数表示货币,例如1等于1美分。你应该使用适当的四舍五入进行转换:

long int cents = lrintf(change * 100.0);

然后像这样替换while循环:

while (cents >= 5000) {
  fifty++;
  cents -= 5000;
}

等等。

问题是float不能表示所有的十进制数,0.02实际上略小于0.02 (0.01小于0.01)。

补救方法是对代表最小面额(即一便士)的整数进行计算。

要么让用户以便士为单位输入金额,要么读取要解析的字符串。
后一种方法既复杂又用户友好,但最好先使用前一种方法得到一个工作程序。
(这两种方法都可以让你忽略无意义的数字,比如3.14159265。)

我还建议你在你的c++书中阅读关于循环和数组的内容。

下面/上面的答案解决了你实际问的问题
但在我看来,我认为你并没有问自己正确的问题。
下面是使用数组编写程序的另一种更简单的方法:

int main(){
    double change;
    double coins[12]{ 50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01 }; //All coins that can be given
    int coinsChanged[12]{0,0,0,0,0,0,0,0,0,0,0,0}; //All coins that are going to be given
    std::cout << "Please enter the amount of change given:n";
    std::cin >> change;
    while (change >= 0.01) { //If the amount gets below the minimum coin you can give, the progrm stops
        for (int i = 0; i < 12; ++i) //Checks all available coins one by one
            while (change >= coins[i]) { 
                coinsChanged[i]++;
                change -= coins[i]; //Add the coin to the "giving" array
            }
    }
    for (int i = 0; i < 12; ++i)
        std::cout << "Give : " << coinsChanged[i] << "  £" << coins[i] << " notes" << std::endl; // Prints everything
    return 0;
}

如果您想随时更改硬币的数量/价值,请考虑使用向量而不是数组