C++提供最低零钱的计划不适用于最低面额
C++ program to give minimum amount of change doesn't work for lowest denominations
这样做的目的是在纸币/硬币的最小数量中给出零钱的数量。到目前为止,我的代码可以很好地处理所有值,除了那些包含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;
}
如果您想随时更改硬币的数量/价值,请考虑使用向量而不是数组
相关文章:
- 回复计划游戏结果不会显示
- OpenGL/Glew C++纹理不适用
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 保证复制省略不应该适用吗?
- 当我在 windows7 中安装程序时,我指定的字体大小不适用
- 使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)
- 任务计划程序库的预处理不起作用 - 多定义错误
- 多米诺骨牌计划。我不知道如何将我的矢量拉到空白中以打印出来
- accelerator.cu(8): 错误:属性"managed"在这里不适用?
- 为什么 std::vector 适用于类定义中的不完整类型?
- C 标准中是否有任何计划来解决初始化器列表构造函数的不一致性
- typedef X=<T>T::UserType1,但如果不适用,typedef X<T>=UserType2
- 为什么哈希<常量字符*>适用于字符串而不是字符串变量?
- 用C++编写一个程序,对一个简单的序列求和:1/N + 2/N-1 + 3/N-2+ ...不适用
- 我的C 计划不会加起来我的总价格
- C++计划不会在返回时结束
- C++的彩票计划不会中奖
- SFINAE在这里不适用吗?
- 当是复制和交换习语不适用
- 在函数实参中使用模板形参不适用gcc4.8