字符串好题!其他题解我来用最简单的思路讲解一遍吧
分析:
- 如果一个一个字符串的读入的话,处理起分子分母就会很麻烦,而读入时用
scanf("%d/%d",&a,&b)
的话就能轻松处理正负号的问题 通分:由
a*b=lcm(a,b)*gcd(a,b)
,得lcm(a,b)=a * b/gcd(a,b)
本题坑点
- 分母为1时需特判
- 结果化成最简整数比:我们可以算每一次的时候都取一遍__gcd(a,b) <---这是库函数,不用手打一遍gcd,
最坑的一点: 当分母为负时,e.g.
2/-3
变成-2/3
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){
x=0;char c=getchar();int f=0;
while(!isdigit(c)){f|=c=='-';c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
x=f?-x:x;
}
#define mem(a,b) memset(a,b,sizeof(a))
int a,b,c,d;
int ans1;//分子
int ans2;//分母
int main(){
scanf("%d/%d",&a,&b);
while(scanf("%d/%d",&c,&d)!=EOF){
int gcd=__gcd(b,d);
int lcm=b*d/gcd;
ans2=lcm;//当前分母
ans1=a*(lcm/b)+c*(lcm/d);//当前分子,请读者自主模拟一下
a=ans1/(__gcd(ans1,ans2));//下一次计算时,a和b代表的是上一次计算的分子分母,顺便约个分
b=ans2/(__gcd(ans1,ans2));
}
ans1=a;//最后一次处理后a就是ans1,这里赋值的原因是a与b约过一次分了
ans2=b;//最后一次处理后b就是ans2
if(ans2<0){//处理 2/-3 -> -2/3的情况
ans1=-ans1;
ans2=-ans2;
}
if(ans2==1)printf("%d\n",ans1);//处理分母为1的情况
else printf("%d/%d\n",ans1,ans2);
return 0;
}