AcWing 656. 钞票和硬币
原题链接
中等
作者:
zqiceberg
,
2020-02-24 22:43:42
,
所有人可见
,
阅读 927
坑在double精度问题上了
坑在1.00的个数上了
#include <cstdio>
using namespace std;
int a[] = {100,50,20,10,5,2};
double b[] = {1.00,0.50,0.25,0.10,0.05,0.01};
int c[] = {100, 50, 25, 10, 5, 1};
int main()
{
double n;
scanf("%lf", &n);
int n1 = n;
int n2 = n * 100 - n1 * 100;
printf("NOTAS:\n");
for (int i = 0; i < 6; i++)
{
int t = n1 / a[i];
printf("%d nota(s) de R$ %d.00\n", t, a[i]);
n1 -= t * a[i];
}
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n", n1);
for (int i = 1; i < 6; i++)
{
int t = n2 / c[i];
printf("%d moeda(s) de R$ %.2lf\n", t, b[i]);
n2 -= t * c[i];
}
return 0;
}
# !
## 赞
你碰到的double的精度问题是啥
这个代码分两个部分
1. 整数部分
2. 1元和小数部分
我刚开始的时候,第一部分和第二部分都直接用double进行计算,然后总是在最后一个币种0.01元那个位置上,少一点精度总是差一点点
后来我把第一部分改成int,第二部分利用*100提高成int,得到结果。这个也是看那个哥们的代码受启发。
我也是0.01那里出了问题,然后给-0.001之后过了。
神奇的是不-0.001时,打印输出的时候x和n/b[i]的值竟然不一样。。。这就无语了。。
这是0.01时的打印输出
double的精确性问题,似乎就是要通过*100,这种操作来提升精确性。小数点后多少位的,都是提升成整数,算一下,实在不行,最后再降回小数,感觉都比较好操作。
等等y总的习题课怎么讲