1 条题解

  • 0
    @ 2023-12-2 19:33:20

    初学者心得:

    如果知道gcd和lcm(什么?还不知道?),题目可以看作是模拟算法:简单分式运算的模拟。

    然后要

    • 了解scanf格式化输入。不用scanf,c的字符串处理起来让人崩溃(差点想引入regex库)
    • 了解scanf的返回值规则(EOF,0,n)
    • 一边输入一边处理,如果用字符串接收整个式子,再去分析处理,将会非常复杂容易出错-

    观察式子,可以看作有限个以/分割的两个带符号整数的组合(前导符号也看作第一个整数的一部分)。这样可以完美用 %d/%d来匹配接收每个部分。

    然后将每个部分累加起来。将这部分逻辑独立成一个函数,程序清晰些。

    还要避免2个坑,看代码末尾。

    #include <bits/stdc++.h>
    using namespace std;
    
    int n=0,m=1,l,g; // 中间结果 n/m
    int  gcd(int a,int b){return b?gcd(b,a%b):a;}
    int lcm(int a, int b){return a*b/gcd(a,b);}
    void add(int a,int b){
    l=lcm(b,m);
    n=n*l/m+a*l/b; //通分相加
    m=l;
    g=gcd(m,n); //约分
    n/=g,m/=g;
    }
    
    int main(){
    int a,b;
    while (scanf("%d/%d",&a,&b)==2)  add(a,b);
    if (m<0) m*=-1,n*=-1; //处理分母为负的情况
    cout<<n; //分子
    if (m>1) cout<<'/'<<m; //分母为1,不需输出
    return 0;
    }
    
    • 1

    信息

    ID
    568
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    28
    已通过
    6
    上传者