【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()
相关推荐
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
inrichtt6 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
信誓旦旦的程序猿7 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河7 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年7 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym7 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
HPtiger7 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训7 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen7 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室7 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python