刚才打saber被double精度坑了,所以直接 *100 变成int就能过了
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double n;
cin >> n;
int m = (int)(n * 100);
double a[12] = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1};
int ans[12] = {0};
for (int i = 0; i < 12; i++)
{
int cnt = 0;
while (m >= a[i])
{
m -= a[i];
cnt++;
}
ans[i] = cnt;
}
puts("NOTAS:");
for (int i = 0; i < 6; i++)
printf("%d nota(s) de R$ %.2lf\n", ans[i], (double)a[i] / 100);
puts("MOEDAS:");
for (int i = 6; i < 12; i++)
printf("%d moeda(s) de R$ %.2lf\n", ans[i], (double)a[i] / 100);
return 0;
}
在这个的基础上,稍微修改了一点,可以更简洁了
优雅
优秀
这个放大法就不对吧,2.01浮点数是2.0099999999999998,乘了100转成整数也是200不是201,也解决不了精度的问题,2.01用这个代码就是错的,0.01硬币数就是0。给的例子463.1是463.00999999999999乘100转成整数是46301,能过只是巧合。我觉得得先+0.001保证转成整数能保留最低位,然后再用整数做,直接*100并没有解决精度问题.
+1
一个有意思的地方,当我加上100这种三位数后,神奇的一幕出现了,后面的那个0.01没有省略掉,初步猜测是因为当数据达到一定的程度后因为机器语言内部的省略机制,它自动向上进位了
订正一下,2.01实际值是2.0099999904632568359375,463.01实际值是463.010009765625,c++浮点数转整形向下取整。对于这个题就是2.01100,不能确定2.0099999904632568359375100这个浮点数实际值是>=201还是<201,如果>=201向下取整的结果就是201,<201取整的结果就是200。乘100并不会让这个误差消失
一样哭死,弄了好久
先取整,然后用数组来!
你这写的有点秀哦,中间的那个for,果然大佬
这个题解好,简洁,*100 把所有数变成整数处理。
笑了,第一次看还不知道啥叫被double精度坑了,直到tm自己也被坑了。。。。
大佬 恍然大悟
换了一种思想,666.
大佬
感觉for循环里有点绕,能不能通过取余的方式做呢?因为根据贪心的思想,总是会先匹配最大的,所以一定是使用钞票最少的,不知道这样大家是否能理解,这是我从“钞票”那一题得出的结论
其实这个想法是比较正统的。贪心的思想正好碰上那题显得比较巧妙了 这个for循环里主要是临时变量用的很秀
https://www.acwing.com/file_system/file/content/whole/index/content/10963689/?from=app_share这样吗?
看不懂啊啊啊啊啊
我也是!
第一个for循环逻辑没明白,
写得太好啦!!!
大佬大佬!!
赏心悦目
Thanks♪(・ω・)ノ
赏心悦目
恍然大悟
我也是
赏心悦目
膜拜
给大佬跪了