PTA刷題——找零
阿新 • • 發佈:2018-12-03
前言
這一題折磨我好久(QAQ),給的樣例測試是正確的,提交上去就是錯誤的答案。
首先:這一題找零需要考慮的有沒有分這個數,有進行對分位置上的值進行考慮,而其中分上面有的有值,有的沒有數
例如:
9.90
9.91
這都是帶有分的測試樣例,但上面一個分上面有相應的數值,而下面一個卻沒有數值,這個是需要分開進行考慮的
其次:
就是輸出格式的問題,空格以及最後取小數點後兩位這個也需要進行注意的
7-10 G. 找零 (100 分)
超市收銀臺出了故障,需要幫忙完成收銀和找零的工作,如果顧客買的東西的總價值含有"分",就進位計算.如:購買了總價值9.91元的物品,收到20元,應找零10元整.如錢不夠,輸出-1
輸入格式:
第一行輸入正整數T,表示資料的組數。
每組資料的第一行是購買的物品的種類數n 和顧客給的錢的總數m(顧客給的錢不會有"分"),接下來有n行[1,100],每行兩個數字,
第一個數字是該物品的價格Pi([0.01,10000]),第二個數字是該物品的數量Ci([1,10])。
輸出格式:
對於每組資料,輸出一行,格式為'case t: x',t 為資料的組號,x 為題目要求的結果。
輸入樣例:
3
5 200.00
9.99 1
8.88 1
0.50 1
1.00 1
2.33 3
1 10.00
9.99 1
2 100.00
98.99 1
1.02 1
輸出樣例:
case 1: 172.60 case 2: 0.00 case 3: -1
給出三個程式碼僅供參考
一:自己寫的經過各方的努力進行修改得到的
#include<bits/stdc++.h> using namespace std; int main() { int t,b; double m,a; cin>>t; for(int j=1; j<=t; j++) { int n; int x,y,s; double sum=0.0,c=0.0,h=0.0; cin>>n>>m; for(int i=0; i<n; i++) { cin>>a>>b; sum+=a*100*b; } s=sum; x=s%10;//取餘 y=s/10;//取商 if(x!=0) { c=(y*10+10)*0.01; //cout<<c<<endl; } else c=sum/100;//就是給出的樣例中是9.90的 h=m-c; // cout<<m<<"-"<<c<<endl; if(c>m) // cout<< "case " << j << ": -1" << endl; printf("case %d: -1\n",j); else printf("case %d: %0.2f\n",j,h); } return 0; }
二:學長寫的,使用陣列以及呼叫函式的
#include <iostream>
using namespace std;
double jindu(double num) {
int a = num*100;
if((a%10)!=0)
a = a/10*10+10;
return (double)a/100;
}
int main() {
int t=-1;
cin>>t;
double r[100];
for(int k = 0; k < t; k++) {
int n = -1;
double sum = 0, m = -1;
cin >> n >> m;
for(int count = 0; count < n; count++) {
double pi = -1;
int ci = -1;
cin>>pi>> ci;
pi *= ci;
sum +=pi;
}
sum=jindu(sum);
if(sum > m)
r[k]=-1;
else
r[k]=m-sum;
}
for(int j=0; j<t; j++) {
if(r[j]==-1)
printf("case %d: -1\n",j+1);
else
printf("case %d: %.2lf\n",j+1,r[j]);
}
return 0;
}
三:網上一個大神給出的程式碼
#include<bits/stdc++.h>
using namespace std;
int main() {
cout.setf(ios::fixed);
int t,b;
double m,a;
double money=0;
scanf("%d",&t);
for(int j=1; j<=t; j++) {
int n;
double sum=0.0;
cin>>n>>m;
for(int i=0; i<n; i++) {
cin>>a>>b;
sum+=a*10*b;
}
sum = ceil(sum);
sum /=10;
money=m-sum;
if(sum>m)
cout<< "case " << j << ": -1" << endl;
else
cout << "case " << j <<setprecision(2) << ": " << money << endl;
}
return 0;
}
總結
卡精度卡到瘋,程式碼是越寫越垃圾