Extracted gcd algorithm into its own function
This commit is contained in:
28
src/main.cpp
28
src/main.cpp
@@ -18,8 +18,25 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <raylib.h>
|
#include <raylib.h>
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||||
|
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||||
|
|
||||||
typedef uint64_t word_t;
|
typedef uint64_t word_t;
|
||||||
|
|
||||||
|
word_t gcd(word_t a, word_t b)
|
||||||
|
{
|
||||||
|
if (a == b)
|
||||||
|
return a;
|
||||||
|
else if (a == 1 || b == 1)
|
||||||
|
return 1;
|
||||||
|
for (word_t r = b % a; r != 0; b = a, a = r, r = b % a)
|
||||||
|
continue;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
struct Fraction
|
struct Fraction
|
||||||
{
|
{
|
||||||
word_t numerator, denominator;
|
word_t numerator, denominator;
|
||||||
@@ -37,14 +54,9 @@ struct Fraction
|
|||||||
// No-Op if already simplified
|
// No-Op if already simplified
|
||||||
if (is_simplified)
|
if (is_simplified)
|
||||||
return;
|
return;
|
||||||
word_t a = numerator < denominator ? numerator : denominator,
|
word_t hcf = gcd(MIN(numerator, denominator), MAX(numerator, denominator));
|
||||||
b = numerator < denominator ? denominator : numerator;
|
numerator /= hcf;
|
||||||
// Euclidean algorithm
|
denominator /= hcf;
|
||||||
for (word_t r = b % a; r != 0; b = a, a = r, r = b % a)
|
|
||||||
continue;
|
|
||||||
// a will be the gcd
|
|
||||||
numerator /= a;
|
|
||||||
denominator /= a;
|
|
||||||
// Ensure this is a noop after this
|
// Ensure this is a noop after this
|
||||||
is_simplified = true;
|
is_simplified = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user