PAT_1081. Rational Sum(辗转相除法)

来源:互联网 发布:阿里云cdn怎么使用 编辑:程序博客网 时间:2024/06/06 03:40
#include <iostream>using namespace std;//辗转相除法,求a和b的最大公约数long long int gcd(int a,int b){if(b==0)return a;elsereturn gcd(b,a%b);}int main(){int N;long long int a1=0,b1=1,a2,b2,maxGys;scanf("%d",&N);for(int i=0;i<N;i++){scanf("%lld/%lld",&a2,&b2);maxGys=gcd(a2,b2);a2/=maxGys;b2/=maxGys;a1=a1*b2+a2*b1;b1=b1*b2;maxGys=gcd(a1,b1);a1/=maxGys;b1/=maxGys;}if(a1>b1&&b1!=1)printf("%lld %lld/%lld",a1/b1,a1%b1,b1);else if(a1%b1==0)printf("%lld",a1);else printf("%lld/%lld",a1,b1);}

 

本题主要考察辗转相除法求最大公约数,摘自网上的解释:

用到辗转相除法求最大公约数   被除数÷除数=商……余数;
                                      如果余数是0,那么此时的被除数是最大公约数;
                                             否则 被除数=除数;除数=余数,继续
int gcd(int b1, int b2){     return b2==0 ? b1 : gcd(b2, b1%b2);}
 

此外只要注意每次加一个分式之前先对其进行约分,加完之后也对和进行约分即可。

原创粉丝点击