洛谷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; }
博客转载必须注出处!