1. 程式人生 > >PTA刷題——找零

PTA刷題——找零

前言

這一題折磨我好久(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;
}

總結

卡精度卡到瘋,程式碼是越寫越垃圾