11: C: Get LCM by prime factorization
This commit is contained in:
parent
05f53d07c8
commit
87291b54e5
1 changed files with 28 additions and 6 deletions
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue