#include
#include
#include
#include
#define MAX_DIVISORS 100
int getDivisors(int *factors, int n) {
int count = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
factors[count++] = i;
}
}
factors[count++] = n;
return count;
}
int main() {
int k = 10;
int denom = 32767;
int base = 48000;
int divisors[MAX_DIVISORS];
int divCount = getDivisors(divisors, base);
double goal = (double)k / denom;
int bestF = 0;
int bestI = 1;
double best = 1;
clock_t start = clock();
for (int i = 1; i <= base; i++) {
for (int f = 0; f < divCount; f++) {
if (i > divisors[f])
continue;
double res = fabs(goal - (double)i / divisors[f]);
if (res < best) {
best = res;
bestI = i;
bestF = f;
}
}
}
clock_t end = clock();
double elapsed = (double)(end - start) * 1000.0 / CLOCKS_PER_SEC;
printf("%d/%d\n", k, denom);
printf("Found best approx: %d/%d (%f, err = %.3g) in %.3f ms\n", bestI, divisors[bestF], (double)bestI / divisors[bestF], best, elapsed);
return 0;
}