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;
}

总结

卡精度卡到疯,代码是越写越垃圾

猜你喜欢

转载自www.cnblogs.com/miraitowa/p/10059714.html