// brute-force solver for http://scratch.mit.edu/projects/16127726
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define GEARS 5
#define MAX_GEARTRAIN 11
int gear[GEARS] = { 10, 20, 30, 50, 80 };
int geartrain[MAX_GEARTRAIN+1];
static char result[1024], *s;
static double best_so_far = 9999999999.9;
void try_ratio(int gearno, double RPM, double target, int max_depth) {
double this;
int i, mult, div;
for (mult = 0; mult < GEARS; mult++) {
geartrain[gearno] = mult;
for (div = 0; div < GEARS; div++) {
geartrain[gearno+1] = div;
this = -RPM*gear[mult]/gear[div];
if (fabs(target-fabs(this)) < best_so_far) { // record the new best so far
best_so_far = fabs(target-fabs(this));
s = result; *s = '\0';
if (this < 0) s += sprintf(s, "reversed ");
s += sprintf(s, "drive ");
for (i = 0; i <= gearno+1; i++) {
s += sprintf(s, "%d ", gear[geartrain[i]]);
if (i != gearno+1) {
if ((i&1) == 0) s+=sprintf(s, " mesh "); else s+=sprintf(s," compound ");
}
}
s+=sprintf(s, " = %f\n", fabs(this));
}
if (gearno < max_depth) try_ratio(gearno+2, this, target, max_depth);
}
}
}
int main(int argc, char **argv) {
int maxdepth;
double target;
if (argc == 2) {
target = atof(argv[1]);
} else if (argc == 3) {
target = atof(argv[1])/atof(argv[2]);
fprintf(stderr, "Target %f\n", target);
} else {
fprintf(stderr, "syntax: gears revs, or gears num denom\n");
exit(1);
}
sprintf(result, "Nothing found\n");
for (maxdepth = 2; maxdepth < MAX_GEARTRAIN; maxdepth++) {
try_ratio(0, 1.00, target, maxdepth);
printf("%s", result);
}
exit(0);
return 1;
}