1 条题解
-
0
初学者心得:
如果知道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
- 上传者