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 Int gcd=1, m_val, n_val, t;
54
55
56
57
58 if( M > N ) { m_val = N; n_val = M; }
59 else { m_val = M; n_val = N; }
60
61 while( m_val > 0 )
62 {
63 while( !( m_val & 1 ) )
64 {
65
66
67
68 m_val >>= 1;
69
70
71
72 if( !( n_val & 1 ) )
73 {
74
75
76
77 n_val >>= 1;
78 gcd <<= 1;
79 }
80 }
81
82
83
84
85 n_val -= ( n_val & 1 ) ? m_val : 0;
86 n_val >>= 1;
87 while( n_val >= m_val )
88 {
89
90
91
92
93 n_val -= ( n_val & 1 ) ? m_val : 0;
94 n_val >>= 1;
95 }
96
97
98
99 t = n_val;
100 n_val = m_val;
101 m_val = t;
102 }
103 return ( n_val * gcd );
104
105
106
107}