P1572 计算分数 题解

· · 题解

这也是本蒟蒻洛谷开专栏后第一次写题解。这题对于学历的要求是比较低的,只要上过小学就足以应付分数的运算,我选择的方法是将这个式子分成多个分数输入,就因为输入我卡了整整六次。

只需要每次输入都加入结果的分数中去,唯一要注意的是每一次加入结果后都要约分使分子与分母互质,以防溢出导致结果错误,然后就是要判断答案的合法性,防止出现分子分母都是负数等等情况,输出答案即可。

Code

#include<bits/stdc++.h>//万能头最好力 
using namespace std;
int z,m,zans,mans=1;
char op;//没啥用 '/'
int main(){
    while(cin>>z>>op>>m){//把式子拆解为多个分数 
        zans=z*mans+m*zans,mans=m*mans;//计入结果 
        int gcd=__gcd(zans,mans);//最大限度的约分就是除以最大公约数 
        zans/=gcd,mans/=gcd;//约分
    }
    if(zans<0&&mans<0)zans=abs(zans),mans=abs(mans);//注意不能直接abs,只有都为负数时才需要转为正数 
    else if(zans>0&&mans<0)mans=abs(mans),printf("-");//分子为正数,分母为负数 
    else if(zans<0&&mans>0)zans=abs(zans),printf("-");//分子为负数,分母为正数
    if(zans==0)cout<<0;//分子为0则该分数=0
    else if(mans==1)printf("%d",zans);//分母为1即化简直接输出分子 
    else cout<<zans<<"/"<<mans;//正常输出
    return 0;//华丽结束~~~ 
}