include [HTML_REMOVED]
include [HTML_REMOVED]
// #include [HTML_REMOVED]
using namespace std;
//错误答案
// int main(){
// double N;
// cin >> N;
// double moneys[12] = {100.00,50.00,20.00,10.00,5.00,2.00,1.00,0.50,0.25,0.10,0.05,0.01};
// bool flag1 = 1;
// bool flag2 = 1;
// printf(“NOTAS:\n”);
// for (int i = 0;i < 6;i ++){
// printf(“%d nota(s) de R$ %.2lf\n”,(int)(N/moneys[i]),moneys[i]);
// // N %= moneys[i]; 坑1:浮点数不能用%,只可整数,无符号整数使用
// N = fmod(N,moneys[i]);
// }
// printf(“MOEDAS:\n”);
// for (int i = 6;i < 12;i ++){
// printf(“%d moeda(s) de R$ %.2lf\n”,(int)(N/moneys[i]),moneys[i]);
// N = fmod(N,moneys[i]);
// }
// return 0;
// }
// 坑2:上面做法错误原因——浮点数表示不准确(因为某些十进制小数在计算机二进制表示为
// 循环小数,而二进制只能用有限位的数字表述,所以最终只能用极其近似的二进制表示),和
// 因为浮点数表示不准确进而导致的舍入误差(由于只能用极其近似的二进制表示,故浮点数进
// 行运算时,只能算出非常近似于预期值的结果)
// 解决办法:把需要运算的浮点数同乘以n+0.5,强转整数再运算,避开舍入误差,最后再/n
// 正确答案
int main() {
double N;
cin >> N;
int amount = (int)(N * 100 +0.5);
int moneys[12] = {10000,5000,2000,1000,500,200,100,50,25,10,5,1};
printf("NOTAS:\n");
for (int i = 0; i < 6; i++) {
printf("%d nota(s) de R$ %.2lf\n", amount / moneys[i], moneys[i] / 100.0);
amount %= moneys[i]; // 使用整数的取余
}
printf("MOEDAS:\n");
for (int i = 6; i < 12; i++) {
printf("%d moeda(s) de R$ %.2lf\n", amount / moneys[i], moneys[i] / 100.0);
amount %= moneys[i];
}
return 0;
}