This commit is contained in:
Oleksii Trekhleb
2018-04-17 09:28:15 +03:00
parent 34522c8087
commit 91457191b1
6 changed files with 111 additions and 7 deletions

View File

@ -20,5 +20,7 @@ describe('euclideanAlgorithm', () => {
expect(euclideanAlgorithm(105, 252)).toBe(21);
expect(euclideanAlgorithm(1071, 462)).toBe(21);
expect(euclideanAlgorithm(462, 1071)).toBe(21);
expect(euclideanAlgorithm(462, -1071)).toBe(21);
expect(euclideanAlgorithm(-462, -1071)).toBe(21);
});
});

View File

@ -1,9 +1,12 @@
/**
* @param {number} a
* @param {number} b
* @param {number} originalA
* @param {number} originalB
* @return {number|null}
*/
export default function euclideanAlgorithm(a, b) {
export default function euclideanAlgorithm(originalA, originalB) {
const a = Math.abs(originalA);
const b = Math.abs(originalB);
if (a === 0 && b === 0) {
return null;
}
@ -16,9 +19,14 @@ export default function euclideanAlgorithm(a, b) {
return a;
}
// Normally we need to do subtraction (a - b) but to prevent
// recursion occurs to often we may shorten subtraction to (a % b).
// Since (a % b) is normally means that we've subtracted b from a
// many times until the difference became less then a.
if (a > b) {
return euclideanAlgorithm(a - b, b);
return euclideanAlgorithm(a % b, b);
}
return euclideanAlgorithm(b - a, a);
return euclideanAlgorithm(b % a, a);
}