28{
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Int gcd=1, m_val, n_val, t;
55
56
57
58
59 if( M > N ) { m_val = N; n_val = M; }
60 else { m_val = M; n_val = N; }
61
62 while( m_val > 0 )
63 {
64 while( !( m_val & 1 ) )
65 {
66
67
68
69 m_val >>= 1;
70
71
72
73 if( !( n_val & 1 ) )
74 {
75
76
77
78 n_val >>= 1;
79 gcd <<= 1;
80 }
81 }
82
83
84
85
86 n_val -= ( n_val & 1 ) ? m_val : 0;
87 n_val >>= 1;
88 while( n_val >= m_val )
89 {
90
91
92
93
94 n_val -= ( n_val & 1 ) ? m_val : 0;
95 n_val >>= 1;
96 }
97
98
99
100 t = n_val;
101 n_val = m_val;
102 m_val = t;
103 }
104 return ( ( M * N ) / ( n_val * gcd ) );
105
106
107
108}