1. 程式人生 > 實用技巧 >【語法深度進化計劃】AcWing 656. 鈔票和硬幣 no.1雙浮點數

【語法深度進化計劃】AcWing 656. 鈔票和硬幣 no.1雙浮點數

題目:
讀取一個帶有兩個小數位的浮點數,這代表貨幣價值。

在此之後,將該值分解為多種鈔票與硬幣的和,每種面值的鈔票和硬幣使用數量不限,要求使用的鈔票和硬幣的數量儘可能少。

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

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

輸入格式
輸入一個浮點數N。

輸出格式
參照輸出樣例,輸出每種面值的鈔票和硬幣的需求數量。

資料範圍
0≤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

時/空限制: 1s / 64MB

題目解析
本題目邏輯簡單,初步判斷的話有兩種思路,思路一就是用減法做,思路二就是用除法做。

思路一:減法
這種做法提交上去後,提示超時
`#include
using namespace std;
int main()
{
double a;
scanf("%lf", &a);
double b[12]={100,50,20,10,5,2,1,0.50,0.25,0.10,0.05,0.01};
int c[12]={0};
int i = 0;
while (a > 0)
{
if(a-b[i] > -0.001){
c[i]++;
a-=b[i];
}
else{
i++;
}
}
printf("NOTAS:\n");
for (int i = 0; i < 12; i++)
{
if(i < 6)
printf("%d nota(s) de R$ %.2lf\n",c[i],b[i]);
if(i ==6)printf("MOEDAS:\n");
if(i >=6)
printf("%d moeda(s) de R$ %.2lf\n",c[i],b[i]);
}

system("pause");
return 0;

}**思路二:除法** 這是自己第一次寫的程式碼,直接利用除法來處理,通過了樣例,但提交顯示WA。#include
using namespace std;
int main()
{
double a;
scanf("%lf", &a);
double b[12]={100,50,20,10,5,2,1,0.50,0.25,0.10,0.05,0.01};
int c[12]={0};
for(int i=0;i<12;i++)
{
int d ;
d = a/b[i];
a= a - d*b[i];
c[i] = d;
}
printf("NOTAS:\n");
for (int i = 0; i < 12; i++)
{
if(i < 6)
printf("%d nota(s) de R$ %.2lf\n",c[i],b[i]);
if(i ==6)printf("MOEDAS:\n");
if(i >=6)
printf("%d moeda(s) de R$ %.2lf\n",c[i],b[i]);
}

system("pause");
return 0;

}`
經過查閱資料,發現用小數來做的話,會有精度的問題。所以產生了兩種解決問題的思路
1、化為整數處理
這裡有點簡單,思路同上,就懶得寫了。
2、中間運算的時候手動轉化
eg:(int)(x+0.00001); 主要是防止2.0000000001/1.0000000002 的情況