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 | 4eea5c966944ef83aca0c72569a35f092809f3fd (patch) | |
tree | f1445bfef3792ebd7abfef3479ee355581e5602e | |
parent | 6f1d634bc2ec45dadeff0d66252c02da5e256985 (diff) | |
download | openttd-4eea5c966944ef83aca0c72569a35f092809f3fd.tar.xz |
(svn r15777) -Add: helper functions to get the least common multiple and the greatest common divisor (Alberth)
-rw-r--r-- | projects/openttd_vs80.vcproj | 4 | ||||
-rw-r--r-- | projects/openttd_vs90.vcproj | 4 | ||||
-rw-r--r-- | source.list | 1 | ||||
-rw-r--r-- | src/core/math_func.cpp | 41 | ||||
-rw-r--r-- | src/core/math_func.hpp | 3 |
5 files changed, 53 insertions, 0 deletions
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index caa5cfe1d..61ab031b8 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -1672,6 +1672,10 @@ > </File> <File + RelativePath=".\..\src\core\math_func.cpp" + > + </File> + <File RelativePath=".\..\src\core\math_func.hpp" > </File> diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index 4ed8aa9e8..0c715ad45 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -1669,6 +1669,10 @@ > </File> <File + RelativePath=".\..\src\core\math_func.cpp" + > + </File> + <File RelativePath=".\..\src\core\math_func.hpp" > </File> diff --git a/source.list b/source.list index 6f3489400..7dd0c1c18 100644 --- a/source.list +++ b/source.list @@ -363,6 +363,7 @@ core/endian_func.hpp core/endian_type.hpp core/enum_type.hpp core/geometry_type.hpp +core/math_func.cpp core/math_func.hpp core/mem_func.hpp core/overflowsafe_type.hpp 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 */ |