• PAT乙级1037


    题目链接

    https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232

    题解

    还算简单,就是模拟我们在生活中的计算,但我想应该会有一个通用性较高的方法,下边的代码还是有重复程度较大的代码的。

    两个需要注意的点:

    1. 负数
    2. 借位
    // PAT BasicLevel 1037
    // https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    int str2num(string str);
    int getSum(int* p);
    
    int main()
    {
        // 获取用户输入
        string strP,strA;
        cin >> strP >> strA;
    
        // 应付
        int p[3];
        p[0] = str2num(strP.substr(0, strP.find_first_of('.') - 0));
        p[1] = str2num(strP.substr(strP.find_first_of('.') + 1, strP.find_last_of('.') - strP.find_first_of('.') - 1));
        p[2] = str2num(strP.substr(strP.find_last_of('.') + 1, strP.length() - strP.find_last_of('.') - 1));
        // 实付
        int a[3];
        a[0] = str2num(strA.substr(0, strA.find_first_of('.') - 0));
        a[1] = str2num(strA.substr(strA.find_first_of('.') + 1, strA.find_last_of('.') - strA.find_first_of('.') - 1));
        a[2] = str2num(strA.substr(strA.find_last_of('.') + 1, strA.length() - strA.find_last_of('.') - 1));
    
        // 判断符号
        int flag=getSum(a)-getSum(p)>=0?1:-1;
    
        // 如果少付了,就交换数组元素
        if(flag<0){
            for(int i=0,temp;i<3;++i){
                temp=a[i];
                a[i]=p[i];
                p[i]=temp;
            }
        }
    
        // 被找钱数
        int result[3];
        int diff,borrow;
        
        // 第三个数
        diff=a[2]-p[2];
        if(diff>=0){
            result[2] = diff;
            borrow=0;
        }else{
            result[2] = diff+29;
            borrow=-1;
        }
    
        // 第二个数
        diff=a[1]-p[1]+borrow;
        if(diff>=0){
            result[1] = diff;
            borrow=0;
        }else{
            result[1] = diff+17;
            borrow = -1;
        }
    
        // 第一个数
        result[0]=a[0]-p[0]+borrow;
    
        // 结果
        if(flag<0){
            cout << '-';
        }
        cout << result[0] << '.' << result[1] << '.' << result[2];
    
        //system("pause");
        return 0;
    }
    
    int getSum(int *p)
    {
        // 以Knut为单位计算总钱数
        return (p[0] * 17 + p[1])*29+p[2];
    }
    
    int str2num(string str)
    {
        // 不考虑负数,字符串转数字
        int num=0;
        for(int i=0;i<str.length();++i){
            num=num*10+(str[i]-'0');
        }
        return num;
    }
    

    作者:@臭咸鱼

    转载请注明出处:https://www.cnblogs.com/chouxianyu/

    欢迎讨论和交流!


  • 相关阅读:
    《C++标准程序库》 第6章 STL Container
    《C++语言99个常见编程错误》
    单例模式
    《C++标准程序库》 第7章 Iterator Adapters
    Shell颜色封装(C++)
    《改善C++程序的150个建议》
    OpenCV之图片的创建、保存和复制
    XMLDOM对象方法:对象事件
    三国中最精辟的十句话
    中国十大名茶及鉴别方法
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/11332743.html
Copyright © 2020-2023  润新知