diff options
author | rubidium <rubidium@openttd.org> | 2009-03-21 01:34:31 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-03-21 01:34:31 +0000 |
commit | 3ef8a09e20d8ab33d3b87d63be0ffa2c34fb427a (patch) | |
tree | f1445bfef3792ebd7abfef3479ee355581e5602e /src/core | |
parent | da37ab321dda9975eb9e8f3243214f8f120b52a9 (diff) | |
download | openttd-3ef8a09e20d8ab33d3b87d63be0ffa2c34fb427a.tar.xz |
(svn r15777) -Add: helper functions to get the least common multiple and the greatest common divisor (Alberth)
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/math_func.cpp | 41 | ||||
-rw-r--r-- | src/core/math_func.hpp | 3 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/core/math_func.cpp b/src/core/math_func.cpp new file mode 100644 index 000000000..360ec0ec5 --- /dev/null +++ b/src/core/math_func.cpp @@ -0,0 +1,41 @@ +/* $Id$ */ + +/** @file math_func.cpp Math functions. */ + +#include "../stdafx.h" +#include "math_func.hpp" + +/** + * Compute least common multiple (lcm) of arguments \a a and \a b, the smallest + * integer value that is a multiple of both \a a and \a b. + * @param a First number. + * @param b second number. + * @return Least common multiple of values \a a and \a b. + * + * @note This function only works for non-negative values of \a a and \a b. + */ +int LeastCommonMultiple(int a, int b) +{ + if (a == 0 || b == 0) return 0; // By definition. + if (a == 1 || a == b) return b; + if (b == 1) return a; + + return a * b / GreatestCommonDivisor(a, b); +} + +/** + * Compute greatest common divisor (gcd) of \a a and \a b. + * @param a First number. + * @param b second number. + * @return Greatest common divisor of \a a and \a b. + */ +int GreatestCommonDivisor(int a, int b) +{ + while (b != 0) { + int t = b; + b = a % b; + a = t; + } + return a; + +} diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index 6a0f5c17a..35e660d88 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -264,4 +264,7 @@ static FORCEINLINE void Swap(T &a, T &b) b = t; } +int LeastCommonMultiple(int a, int b); +int GreatestCommonDivisor(int a, int b); + #endif /* MATH_FUNC_HPP */ |