7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!

文章讲述了如何使用C++编程解决金融系统中货币转换的问题,通过map容器存储不同面额及其对应硬币数量,精确处理double类型的小数精度问题,确保正确计算金币个数。
摘要由CSDN通过智能技术生成

本题当中自我感觉很开窍的地方,我们给付款金额加上0.00001,这样就能保证我的数据最起码是大于面值的,最后的余额再跟0.00001比较,如果小于其就是可以完全换成金币个数的。注意这里不能是等于0.00001,因为确实是两个数不相等,而且即便你将调试显示的数抄上去都不行!!!

四:上码

===================================================================

/**

思路:1.map容器进行存储 键值为面值(0.05,0.1,0.2,0.5,1,2) 关键值为对应的硬币个数

2.将付款金额跟面值进行比较,找到刚好大于其面值的银币,并判断其个数是否有无,

1>:如果其个数为0就继续往下寻找银币,直到银币个数不为0为止

2>:如果其个数不为0的话那么我们就选择 小于 付款金额的 银币数 并记录个数

付款金额 = 付款金额 - 面值*银币数;

当付款金额小于面值的时候继续往下寻找更小的面值

当银币数不够了也是往下继续寻找最小隐蔽数

3.如果最后的付款金额不为0,那么就是 impossible

测试数据:2

2 4 2 2 1 0 0.95

2 4 2 0 1 0 0.55

4.注意处理数据中的小数问题,因为double 存的数据和真实的并不一样

eg :比如存入的是0.95 其实是0.9499999999182,那么当数据剩下0.0499909

那么它和0.05就无法比较了

*/

#include<bits/stdc++.h>

using namespace std;

int res(vector& v){

map<double,double>m;

map<double,double>:: reverse_iterator t;

int length = v.size();

float pay = 0.00001; //付款金额

int cnt = 0;//统计银币个数

for(int i = length - 1; i >= 0; i–){

if(i == 0) m[0.05] = v[i];

if(i == 1) m[0.1] = v[i];

if(i == 2) m[0.2] = v[i];

if(i == 3) m[0.5] = v[i];

if(i == 4) m[1] = v[i];

if(i == 5) m[2] = v[i];

if(i == 6) pay += v[i];

}

for(t = m.rbegin(); t != m.rend(); t++){

if(pay >= t->first && t->second != 0){//如果付款金额大于其面值 并且该面值银币数不为0

for(int i = 0; i < t->second; i++){

if(pay >= t->first){//这里确保每次的付款金额均大于面值

pay = pay - t->first;

cnt++;

}else{

break;

}

}

}

}

//cout << cnt;

// cout << pay << endl;

//0.00999999139

if(pay <= 0.001){

return cnt;

// cout << “wyj”;

}

return -1;

}

int main(){

int n;

cin >> n;

for(int i = 0; i < n; i++){

vectorv;

for(int i = 0; i < 7; i++){

double nums;

cin >> nums;

v.push_back(nums);

}

int ans = res(v);

if(ans == -1){

cout << “impossible” << endl;

}else{

cout << ans << endl;

}

}

}

//2

//2 4 2 2 1 0 0.95

//2 4 2 0 1 0 0.55

//

//

//1

//2 4 2 2 1 0 0.95

//1

//2 4 2 2 1 0 0.05

//

//1

//2 4 2 2 1 0 0.95

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

img

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-QAiAFqUu-1711572039596)]

[外链图片转存中…(img-caHVwZU7-1711572039596)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值