summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-03-21 01:34:31 +0000
committerrubidium <rubidium@openttd.org>2009-03-21 01:34:31 +0000
commit3ef8a09e20d8ab33d3b87d63be0ffa2c34fb427a (patch)
treef1445bfef3792ebd7abfef3479ee355581e5602e /src/core
parentda37ab321dda9975eb9e8f3243214f8f120b52a9 (diff)
downloadopenttd-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.cpp41
-rw-r--r--src/core/math_func.hpp3
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 */