星空's Blog
星空's Blog
PAT-A1081 Rational Sum

原题

Rational Sum (20 分)

题解

输出的格式可以适当修改后直接复用PAT-A1088 Rational Arithmetic
注意一下输入流的处理就可以了
还有就是注意每次累加对结果进行化简操作,否则最后2个case过不了,会溢出。

代码

#include <iostream>
#include <string>
using namespace std;

long hcf(long a,long b) {
    int c = b;
    while (a % b != 0) {
        c = a % b;
        a = b;
        b = c;
    }
    return c;
}

string p(long a,long b) {
    bool isNegative = false;
    bool hasExtraInt = false;
    long c = 0;
    if (a < 0) {
        isNegative = true;
        a = -a;
    }
    if (b == 0) {
        return "Inf";
    }
    if (a % b) {
        if (a > b) {
            hasExtraInt = true;
            c = a / b;
            a = a % b;
        }
    }
    if (isNegative) {
        if (hasExtraInt) {
            return "-" + to_string(c) + " " + to_string(a) + "/" + to_string(b);
        }
        return "-" + (a % b == 0 ? to_string(a / b) : to_string(a) + "/" + to_string(b));
    } else {
        if (hasExtraInt) {
            return to_string(c) + " " + to_string(a) + "/" + to_string(b);
        }
        return a % b == 0 ? to_string(a / b) : to_string(a) + "/" + to_string(b);
    }
}

int main(void) {
    int n;
    string s;
    cin >> n;
    long t1 = 0,t2 = 1;
    for (int i = 0;i < n;i++) {
        cin >> s;
        long a =  stoi(s.substr(0,s.find("/")));
        long b =  stoi(s.substr(s.find("/") + 1));
        t1 = t1 * b + t2 * a;
        t2 = t2 * b;
        long h = hcf(t1,t2);
        if (h > 1) {
            t1 = t1 / h;
            t2 = t2 / h;
        }
    }
    cout << p(t1,t2) << endl;
    return 0;
}
所有文章禁止转载。
代码仅供参考
为了对抗广告机器人,首次留言将会被审核
首页      算法学习      PAT-A      PAT-A1081 Rational Sum
https://secure.gravatar.com/avatar/271861a23dcdde929d3ee8cb8c04f854?s=256&d=monsterid&r=g

星空

文章作者

发表评论

textsms
account_circle
email

星空's Blog

PAT-A1081 Rational Sum
原题 Rational Sum (20 分) 题解 输出的格式可以适当修改后直接复用PAT-A1088 Rational Arithmetic 注意一下输入流的处理就可以了 还有就是注意每次累加对结果进行化简操作,否则最后2个c…
扫描二维码继续阅读
2019-08-28
分类
标签云