【PAT甲级真题】- Rational Sum (20)

题目来源

Rational Sum - PTA

注意点:

  • 只输出整数,只输出小数以及正常输出都要加换行
  • 注意特判输出0

题目大意

给出若干有理数,求和,按照最简分数的格式输出

思路简介

逐个按照分数加法相加即可

  • 先通分:求分母最大公约数,然后计算最大公倍数
  • 分子相加
  • 求分子分母公约数化简

注意几个细节:

  • 计算时,整数类型应为 long long 否则会爆整数,python 版自带高精度不用考虑这个问题
  • 只输出整数,只输出小数以及正常输出都要加换行
  • 注意特判输出 0 0 0, 0 0 0 也要带换行

python 当中的 fraction.Fraction(a,b) 正好是这种类型

Fraction(a,b) 类型即以 a 为分子,b 为分母的分数,其中 a,b 都是整数,可以去掉通分的过程

本题当中有个不是很严谨的地方,举个例子 -2/3 的最简分数应当是 -1 1/3 ,但是不论是 -2/3 还是前者,答案都是对的,没有设置这类的样例

c++代码中为了简便(其实是博主偷懒没写 )使用的是-2/3

python代码当中由于是用库计算的,会更加的标准,答案则是 -1 1/3

遇到的问题

  1. 只输出整数时忘记换行
  2. 类型开错

代码

c++

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll gcd(ll a,ll b){
    return (!b?a:gcd(b,a%b));
}

void solve(){
    int n;cin>>n;
    vector<ll>a(n),b(n);
    for(int i=0;i<n;++i){
        char c;
        cin>>a[i]>>c>>b[i];
    }
    
    ll resa=a[0],resb=b[0];

    for(int i=1;i<n;++i){
        ll g=gcd(resb,b[i]);
        ll c=resb/g*b[i];
        a[i]*=resb/g;
        resa*=b[i]/g;
        resa+=a[i];
        resb=c;

        g=gcd(resa,resb);
        resa/=g,resb/=g;
    }

    if(!resa){
        cout<<0<<'\n';
        return;
    }

    int g=gcd(resa,resb);
    resa/=g,resb/=g;
    ll k=resa/resb;
    resa=resa-k*resb;
    
    if(k&&resa)cout<<k<<' '<<resa<<'/'<<resb;
    else if(k)cout<<k;
    else cout<<resa<<'/'<<resb;
    cout<<'\n';
    
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //fstream in("in.txt");cin.rdbuf(in.rdbuf());
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

python

python 复制代码
from fractions import Fraction

def solve(data):
    n=int(data[0])

    ans=Fraction(0,1)   # 构造Fraction类型

    for i in range(1,n+1):
        a,b=map(int,data[i].split('/'))
        ans+=Fraction(a,b)

    if ans==0:
        print(0)
        return

    n=ans.numerator
    d=ans.denominator

    inter=n//d
    numer=n%d

    if inter and numer:
        print(f"{inter} {numer}/{d}")
    elif inter:
        print(inter)
    else: 
        print(f"{numer}/{d}")


import sys
def main():
    sys.stdin = open("in.txt")
    data=sys.stdin.read().split()
    solve(data)

if __name__ == "__main__":
    main()
相关推荐
Highcharts.js7 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
爱昏羔8 小时前
下篇:从检索到交互 — 物流RAG问答系统与WebUI全实现
python·langchain·agent
_Jimmy_8 小时前
Agent引用数据库知识过时的增量同步方案
人工智能·python·langchain
王维同学9 小时前
Winsock 协议与名称空间 Provider 目录
网络·c++·windows·安全
min(a,b)9 小时前
学习第 4 天:面向对象与异常处理
python·学习·学习方法
拳里剑气11 小时前
C++算法:BFS解决FloodFill算法
c++·算法·bfs·宽度优先
爱写代码的小朋友11 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
yangshicong11 小时前
第19章:AI安全防护与AI安全
人工智能·python·安全·prompt·ai编程