目录
  1. 1. 钞票和硬币
    1. 1.1. 问题描述
      1. 1.1.0.1. 输入格式
      2. 1.1.0.2. 输出格式
      3. 1.1.0.3. 数据范围
      4. 1.1.0.4. 输入样例:
      5. 1.1.0.5. 输出样例:
  2. 1.2. 问题分析
  3. 1.3. 代码实现
  4. 1.4. 运行结果
  5. 1.5. 总结
钞票和硬币

钞票和硬币

问题描述

读取一个带有两个小数位的浮点数,这代表货币价值。

在此之后,将该值分解为多种钞票与硬币的和,每种面值的钞票和硬币使用数量不限,要求使用的钞票和硬币的数量尽可能少。

钞票的面值是100,50,20,10,5,2。

硬币的面值是1,0.50,0.25,0.10,0.05和0.01。

输入格式

输入一个浮点数N。

输出格式

参照输出样例,输出每种面值的钞票和硬币的需求数量。

数据范围

0≤N≤1000000.000≤N≤1000000.00

输入样例:

576.73

输出样例:

NOTAS:
5 nota(s) de R$ 100.00
1 nota(s) de R$ 50.00
1 nota(s) de R$ 20.00
0 nota(s) de R$ 10.00
1 nota(s) de R$ 5.00
0 nota(s) de R$ 2.00
MOEDAS:
1 moeda(s) de R$ 1.00
1 moeda(s) de R$ 0.50
0 moeda(s) de R$ 0.25
2 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
3 moeda(s) de R$ 0.01

问题分析

此题增加了小数的分解,将小数逐一分解应,就要考虑到浮点数如何取余问题,以及浮点数取整问题

代码实现

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main(){
//读取一个带有两个小数位的浮点数,这代表货币价值。
double m;//钱
cin>>m;
int mm=m*100;//将钱扩大100倍
int a[] = {10000, 5000, 2000, 1000, 500, 200};
int b[] = {100, 50, 25, 10, 5, 1};

cout<<"NOTAS:" <<endl;
for(int i=0;i<6;i++){
cout<<mm/a[i]<<" nota(s) de R$ "<<fixed<<setprecision(2)<<a[i]/100.00<<endl;
mm=mm%a[i];
}
cout<<"MOEDAS:" <<endl;
for(int i=0;i<6;i++){
cout<<mm/b[i]<<" moeda(s) de R$ "<<fixed<<setprecision(2)<<b[i]/100.00<<endl;
mm=mm%b[i];
}
return 0;
}

运行结果

541.26
NOTAS:
5 nota(s) de R$ 100.00
0 nota(s) de R$ 50.00
2 nota(s) de R$ 20.00
0 nota(s) de R$ 10.00
0 nota(s) de R$ 5.00
0 nota(s) de R$ 2.00
MOEDAS:
1 moeda(s) de R$ 1.00
0 moeda(s) de R$ 0.50
1 moeda(s) de R$ 0.25
0 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
1 moeda(s) de R$ 0.01

总结

对于该题,采用了循环的方式,对数进行拆解。以及题目给明小数两位数,那么将原数字扩大100倍,且,所又金额面额同时扩大100倍,再通过输出精度控制,实现了浮点数的取余与取整。

文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-01/22/%E7%AE%97%E6%B3%95/%E9%92%9E%E7%A5%A8%E5%92%8C%E7%A1%AC%E5%B8%81/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论