#include #include #include void approx(int z, int n, int nmax, int *za, int *na) { int z0 = 0, n0 = 1, z1 = 1, n1 = 0, q, t; double soll = (double)z / n; // Kettenbruchentwicklung while (n) { q = z / n; t = z - q * n; z = n; n = t; t = q * n1 + n0; if (t > nmax) break; n0 = n1; n1 = t; t = q * z1 + z0; z0 = z1; z1 = t; } q = (nmax - n0) / n1; z0 = q * z1 + z0; n0 = q * n1 + n0; // z1/n1 ist der beste (Haupt-)Näherungbruch, z0/n0 der beste // Nebennäherungsbruch. Besten von beiden als Ergebnis liefern: if ( fabs((double)z1 / n1 - soll) < fabs((double)z0 / n0 - soll) ) { *za = z1; *na = n1; } else { *za = z0; *na = n0; } } int main(int argc, char **argv) { int z = atoi(argv[1]), n = atoi(argv[2]), nmax = atoi(argv[3]); int za, na; approx(z, n, nmax, &za, &na); printf("%d/%d\n", za, na); return 0; }