HDU-1713 相遇周期 LCD LCM

  简单点说题目就是要求连个分数的最小公倍数,这个题目上次在参加比赛时遇到过,不过那时候是用很暴力的方法过的。本来上次我们已经推出来是求两个最简形式分数的分母的最小公倍数以及分母的最大公约数,不过就是A不掉,不过还好这次过掉了,方法论证是没错的。

  对于两个最简的分数 a / b, c / d 把他们两个的最小公倍数 x / y 也设为一个分数形式,那么这个 x 一定能够整除 a , c, y 一定能够被 b , d整除。那么要求得最小公倍数,那么肯定是分子尽量小,即 a , c 的最小公倍数, 分母尽量大, 即 b , d 的最大公约数。

  代码如下:

 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include <string.h>
5
6 int gcd( int x, int y )
7 {
8 if( y == 0 )
9 return x;
10 else
11 return gcd( y, x % y );
12 }
13
14 int lcm( int x, int y )
15 {
16 return x / gcd( x, y ) * y;
17 }
18
19 int main()
20 {
21 int T;
22 scanf( "%d", &T );
23 while( T-- )
24 {
25 int a, b, c, d, rx, ry;
26 scanf( "%d/%d", &a, &b );
27 scanf( "%d/%d", &c, &d );
28 int t = gcd( a, b );
29 a /= t, b /= t;
30 t = gcd( c, d );
31 c /= t, d /= t;
32 if( gcd( b, d ) == 1 )
33 {
34 printf( "%d\n", lcm( a, c ) );
35 }
36 else
37 {
38 printf( "%d/%d\n", lcm( a, c ), gcd( b, d ) );
39 }
40 }
41 return 0;
42 }
posted @ 2011-08-28 09:30  沐阳  阅读(1323)  评论(0编辑  收藏  举报