【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()
相关推荐
段一凡-华北理工大学9 小时前
工业智能体:从Codex/Claude到项目实战~系列文章05:从“AI助手“到“工业智能体“:能力跃迁与落地范式
人工智能·python·claude·codex·工业智能体·高炉炼铁智能化
深蓝AI10 小时前
ContextVar 到线程池就丢了?asyncio.to_thread 和 run_in_executor 实测
python
曦樂~10 小时前
Cpp面筋
c语言·c++
道尔柯南11 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
岁月宁静11 小时前
什么是 Agent:从"会聊天"到"会做事"
人工智能·python
岁月宁静11 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
来让爷抱一个12 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
小肝一下13 小时前
3.基础语法(3)
python
Dream it possible!13 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊14 小时前
算法之双指针系列(一)
算法·leetcode