mirror of https://github.com/OpenTTD/OpenTTD
(svn r15777) -Add: helper functions to get the least common multiple and the greatest common divisor (Alberth)
parent
da37ab321d
commit
3ef8a09e20
|
@ -1671,6 +1671,10 @@
|
||||||
RelativePath=".\..\src\core\geometry_type.hpp"
|
RelativePath=".\..\src\core\geometry_type.hpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\..\src\core\math_func.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\core\math_func.hpp"
|
RelativePath=".\..\src\core\math_func.hpp"
|
||||||
>
|
>
|
||||||
|
|
|
@ -1668,6 +1668,10 @@
|
||||||
RelativePath=".\..\src\core\geometry_type.hpp"
|
RelativePath=".\..\src\core\geometry_type.hpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\..\src\core\math_func.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\core\math_func.hpp"
|
RelativePath=".\..\src\core\math_func.hpp"
|
||||||
>
|
>
|
||||||
|
|
|
@ -363,6 +363,7 @@ core/endian_func.hpp
|
||||||
core/endian_type.hpp
|
core/endian_type.hpp
|
||||||
core/enum_type.hpp
|
core/enum_type.hpp
|
||||||
core/geometry_type.hpp
|
core/geometry_type.hpp
|
||||||
|
core/math_func.cpp
|
||||||
core/math_func.hpp
|
core/math_func.hpp
|
||||||
core/mem_func.hpp
|
core/mem_func.hpp
|
||||||
core/overflowsafe_type.hpp
|
core/overflowsafe_type.hpp
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
|
@ -264,4 +264,7 @@ static FORCEINLINE void Swap(T &a, T &b)
|
||||||
b = t;
|
b = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int LeastCommonMultiple(int a, int b);
|
||||||
|
int GreatestCommonDivisor(int a, int b);
|
||||||
|
|
||||||
#endif /* MATH_FUNC_HPP */
|
#endif /* MATH_FUNC_HPP */
|
||||||
|
|
Loading…
Reference in New Issue