1
0
Fork 0

11: C: Get LCM by prime factorization

This commit is contained in:
Mia Herkt 2022-12-12 00:08:30 +01:00
parent 05f53d07c8
commit 87291b54e5
Signed by: mia
GPG Key ID: 72E154B8622EC191
1 changed files with 28 additions and 6 deletions

View File

@ -1,6 +1,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct Monkey {
unsigned long business;
@ -20,15 +21,37 @@ int compar(const void *a, const void *b) {
return 0;
}
unsigned long calc_lcm(Monkey *monkeys, int count) {
unsigned long lcm = 1;
for (int m = 0; m < count; m++) {
unsigned long v = monkeys[m].test;
while (!(v % 2)) {
lcm *= 2;
v /= 2;
}
for (unsigned long i = 3; i <= sqrt(v); i += 3) {
while (!(v % i)) {
lcm *= i;
v /= i;
}
}
if (v > 2)
lcm *= v;
}
return lcm;
}
unsigned long monkey_business(Monkey *monkeys, int count, int steps, int part2) {
Monkey *copy = malloc(count * sizeof(Monkey));
memcpy(copy, monkeys, count * sizeof(Monkey));
monkeys = copy;
unsigned long lcm = 1;
if (part2)
for (int m = 0; m < count; m++)
lcm *= monkeys[m].test; // these are all primes
unsigned long lcm = part2 ? calc_lcm(monkeys, count) : 0;
for (int s = 0; s < steps; s++) {
for (int m = 0; m < count; m++) {
@ -43,8 +66,7 @@ unsigned long monkey_business(Monkey *monkeys, int count, int steps, int part2)
case '*': new *= val; break;
}
if (part2) new %= lcm;
else new /= 3;
new = part2 ? new % lcm : new / 3;
int target = monkeys[m].true;
if (new % monkeys[m].test)