洛谷P1482 Cantor表(升级版) 题解

题目传送门

此题zha一看非常简单。

再一看特别简单。

最后瞟一眼,还是很简单。

所以在此就唠一下GCD大法吧:

int gcd(int x,int y){
    if(x<y) return gcd(y,x);
    if(y==0)  return x;
    if(x%2==0)
        if(y%2==0) return 2*gcd(x>>1,y>>1);
        else return gcd(x>>1,y);
    else
        if(y%2==0) return gcd(x,y>>1);
        else return gcd(y,x-y); 
}

优化过后的GCD↑

基本思路就是,如果x,y都为偶数,两数同乘2且求GCD(x/2,y/2) //分治思想

否则如果x、y任意一个是偶数,那么就把偶数的/2,因为另一个数并不是偶数,所以公因数怎么也不能*2(当前)。

最后一种情况就是取GCD(y,x-y)。因为x、y都是奇数。

这道题的程序:

#include<bits/stdc++.h>
using namespace std;
int gcd(int x,int y){
    if(x<y) return gcd(y,x);
    if(y==0)  return x;
    if(x%2==0)
        if(y%2==0) return 2*gcd(x>>1,y>>1);
        else return gcd(x>>1,y);
    else
        if(y%2==0) return gcd(x,y>>1);
        else return gcd(y,x-y); 
}
int main(){
    int a,b,c,d,t;
    scanf("%d/%d",&a,&b);
    scanf("%d/%d",&c,&d);
    t=gcd(a*c,b*d);
    printf("%d %d",b*d/t,a*c/t);
    return 0;
}
原文地址:https://www.cnblogs.com/yzx1798106406/p/9038098.html