• 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/

    欢迎讨论和交流!


  • 相关阅读:
    关于git---远程
    关于git---主要
    css特效
    Canvas图片压缩
    TypeScript简单介绍
    html 常见兼容性问题及解决方法
    cookies,sessionStorage 和 localStorage 的区别
    vue-element-admin vue.config.js
    ② nodejs + mongodb 搭建服务器
    ① 数据自动填充
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/11332743.html
Copyright © 2020-2023  润新知