zoukankan      html  css  js  c++  java
  • 随手练——分式计算

      除了分子为1,为0的情况,还有要注意的就是对不同的运算,不同的输入,负号可能在不同的位置,按道理来说,负数符号应该写在分子。题目没说清楚负号写哪儿,要么就是测试数据根本不会触及到负数,要么就是出题人没考虑到,诅咒出题人vbhsdvbkjsdvadb,题目没说 还是不做处理的好,写了说不定反而会错。

      像这个题目,测试数据给的很清楚,符号写在分子上:https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3849.html

    但是这个题目没有考虑为分子为0的情况(我把分子为0那一段注释了,交也AC了),对,我就是魔鬼。

    #include <iostream>
    
    using namespace std;
    typedef long long ll;
    ll gcd(ll a, ll b) {
        return b ? gcd(b, a%b) : a;
    }
    ll lcm(ll a, ll b) {
        return a / gcd(a, b)*b;
    }
    void reduction(ll &a, ll &b) {
        ll t = gcd(a, b);
        a /= t; b /= t;
    }
    
    void add(ll &a1, ll &b1, ll &a2, ll &b2) {
        ll x = lcm(b1, b2);
        a1 = a1 * (x / b1) + a2 * (x / b2);
        b1 = x;
        reduction(a1, b1);
    }
    void sub(ll &a1, ll &b1, ll &a2, ll &b2) {
        ll x = lcm(b1, b2);
        a1 = a1 * (x / b1) - a2 * (x / b2);
        b1 = x;
        reduction(a1, b1);
    }
    
    void mul(ll &a1, ll &b1, ll &a2, ll &b2) {
        a1 *= a2;
        b1 *= b2;
        reduction(a1, b1);
    }
    
    void divide(ll &a1, ll &b1, ll &a2, ll &b2) {
        a1 *= b2;
        b1 *= a2;
        reduction(a1, b1);
    }
    int main() {
        ll x1, y1, x2, y2;
        char symbol;
        while (~scanf("%lld/%lld%c%lld/%lld", &x1, &y1, &symbol, &x2, &y2)){
    
            switch (symbol)
            {
            case '+':add(x1, y1, x2, y2);
                break;
            case '-':sub(x1, y1, x2, y2);
                break;
            case '*':mul(x1, y1, x2, y2);
                break;
            case '/':
                case '\':
                    divide(x1, y1, x2, y2);
                break;
            default:
                break;
            }
            if (y1 < 0) {
                x1 = -x1; y1 = -y1;
            }
            if (y1 == 1)
                cout << x1 << endl;
            else if (y1 == 0)
                cout << 0 << endl;
            else
                cout << x1 << "/" << y1 << endl;
        }
        return 0;
    }
  • 相关阅读:
    总结php删除html标签和标签内的内容的方法
    php正则验证手机、邮箱
    php正则匹配到字符串里面的a标签
    PHP 使用try catch,捕获异常
    Apache漏洞利用与安全加固实例分析
    php json接口demo
    PHP 把MYSQL重复ID 二维数组重组为三维数组
    文件扩展关联命令(assoc)
    修改文件属性(attrib)
    文件比较命令(fc)
  • 原文地址:https://www.cnblogs.com/czc1999/p/10270131.html
Copyright © 2011-2022 走看看