рдЬреАрд╕реАрдбреА рдХреНрдпрд╛ рд╣реИ, рд╕реНрдХреВрд▓ рд╕реЗ рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рднреВрд▓ рдЧрдП рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ: рдЬреАрд╕реАрдбреА рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЬрдХ рд╣реИ, рджреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ рд╢реЗрд╖ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ 100 рдФрд░ 45 рдХрд╛ GCD 5 рд╣реИ, рдФрд░ рд╕рдВрдЦреНрдпрд╛ 17 рдФрд░ 7 рдХрд╛ GCD рд╣реИред рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпреЗ рдХрд╛рдлреА
рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ, рд╡реЗ рдЕрдХреНрд╕рд░ рдПрдХ рдЫреЛрдЯреА, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВред
рдЬреАрд╕реАрдбреА рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо
рдореИрдВ GCD рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП 5 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛:
1. рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдмрдЪреЗ рд╣реБрдПpublic static int gcd_1(int a, int b) { if (b == 0) return a; return gcd_1(b, a % b); }
2. рдПрдХ рд╣реА рдЕрд╡рд╢рд┐рд╖реНрдЯ, рд▓реЗрдХрд┐рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ public static int gcd_2(int a, int b) { int t; while (b != 0) { t = b; b = a % b; a = t; } return a; }
3. рдХреНрд▓рд╛рд╕рд┐рдХ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо public static int gcd_3(int a, int b) { while (a != b) { if (a > b) { a = a - b; } else { b = b - a; } } return a; }
4. рдЬреАрд╕реАрдбреА рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо public static int gcd_4(int a, int b) { if (a == b) return a; if (a == 0) return b; if (b == 0) return a; if ((~a & 1) != 0) { if ((b & 1) != 0) return gcd_4(a >> 1, b); else return gcd_4(a >> 1, b >> 1) << 1; } if ((~b & 1) != 0) return gcd_4(a, b >> 1); if (a > b) return gcd_4((a - b) >> 1, b); return gcd_4((b - a) >> 1, a); }
5. рдмрд╛рдЗрдирд░реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд┐рдЯ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ public static int gcd_5(int a, int b) { int shift; if (a == 0) return b; if (b == 0) return a; for (shift = 0; ((a | b) & 1) == 0; ++shift) { a >>= 1; b >>= 1; } while ((a & 1) == 0) a >>= 1; do { while ((b & 1) == 0) b >>= 1; if (a > b) { int t = b; b = a; a = t; } b = b - a; } while (b != 0); return a << shift; }
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рддреЗрдЬреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
pretests
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
gcd(1, 10) = 1 gcd(5, 10) = 5 gcd(24, 24) = 24 gcd(0, 0) = 0 gcd(5,10) = 5
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╡реЗ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЕрдЧрд░ ...
рдкрд╣рд▓реА рдЪрд╛рд▓ рдкрд░реАрдХреНрд╖рдг
... рдпрджрд┐ рдЖрдк рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
gcd(5, 0) = 5 gcd(0, 15) = 15
рд╢рд╛рд╕реНрддреНрд░реАрдп рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдирдВрдмрд░ 3) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЧрд╣рд░реА рдЦреБрджрд╛рдИ
рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, GCD рдХреЛ рдХрд┐рдиреНрд╣реАрдВ рджреЛ
рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ:
gcd(-5,10) = ?
рд╕рдм рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдкрд╣рд▓реЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ
-5 рджреЗрддреЗ рд╣реИрдВред рддреАрд╕рд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдлрд┐рд░ рд╕реЗ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдкрд╛рдВрдЪрд╡рд╛рдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИред рдЪреМрдерд╛ StackOverFlow рдкрд░ рдЧрд┐рд░рддрд╛ рд╣реИ - рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рднреА рдЖрддреА рд╣реИред
рд▓реЗрдХрд┐рди рдЙрддреНрддрд░
-5 рдЧрд▓рдд рд╣реИред рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, GCD
рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдХ рд╣реИред рдФрд░ рдРрд╕рд╛ рдирдВрдмрд░
5 рд╣реИ ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдкрд╣рд▓реА рдФрд░ рджреВрд╕рд░реА рд╕рдВрдЦреНрдпрд╛ 5 рд╕реЗ
рд╡рд┐рднрд╛рдЬреНрдп рд╣реИред рдкрд╣рд▓реЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдХреНрдпреЛрдВ рд╕рдорд╛рдзрд╛рди рдирдВрдмрд░ 3-5 рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдЖрддреЗ рд╣реИрдВ?
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддрд░реНрдХреЛрдВ рдореЗрдВ рдЕрдирдВрдд рд╡реГрджреНрдзрд┐ рдХреЗ рдХрд╛рд░рдг рд▓реВрдк рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЗрди рд░реЗрдЦрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐
a (рдпрд╛
b ) рдЛрдгрд╛рддреНрдордХ рд╣реИ, рддреЛ рдШрдЯрд╛рд╡ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
if (a > b) { a = a - b; } else { b = b - a; }
рдЪреМрдереА рдФрд░ рдкрд╛рдБрдЪрд╡реАрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдмрд╛рдд рд╣реЛрддреА рд╣реИ:
if (a > b) return gcd_4((a - b) >> 1, b); return gcd_4((b - a) >> 1, a);
if (a > b) { int t = b; b = a; a = t; } b = b - a;
рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ
рдПрдХ рдпрд╛
рдмреА 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рд╢реВрдиреНрдп рдХрд╛ рдПрдХ рдЕрдирдВрдд рдШрдЯрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рддреЛ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?
рдпреЗ рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИрдВ рдЬрдм рд╕рдВрдЦреНрдпрд╛
рдП рдФрд░
рдмреА рджреЛрдиреЛрдВ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ - рдЬреАрд╕реАрдбреА рдХрд┐рд╕реА рднреА рджреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред
рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрддреНрддрд░ рд╕рд╣реА рд╣реЛрдЧрд╛:
int ans = gcd(Math.abs(a), Math.abs(b));
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЙрддреНрддрд░ рдХрд╛ рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рди рд▓реМрдЯрд╛рдирд╛ рд╣реИ:
public static int gcd(int a, int b) { if (b == 0) return Math.abs(a); return gcd(b, a % b); }
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ: рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдкрд░рд┐рдгрд╛рдо
рд╣рдордиреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЙрд╕ рдЗрдирдкреБрдЯ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛, рдЬрд┐рд╕ рдкрд░ рдЙрддреНрддрд░ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди "рдЧрд┐рд░рддрд╛ рд╣реИ", рд╕рд╛рде рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреА рдЫреЛрдЯреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдлрд┐рд╕рд▓рди" рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдкрдХрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдЬреАрд╕реАрдбреА рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рд╣реИрдВред рд╡реЗрдм рдкрд░, рдореБрдЭреЗ рдХреЗрд╡рд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдорд┐рд▓реЗ, рдмрд╛рдХреА рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рдорд╛рди рд╣реИрдВред
рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп, рд╕реНрд░реЛрдд, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: