#include #include typedef struct { int a, b; double f; } triple; typedef struct { int size; triple *array; } heap; int gcd ( int a, int b ) { int r; if (a < 0) a = -a; if (b < 0) b = -b; if (a == 0) return b; if (b == 0) return a; while (b) { r = a % b; a = b; b = r; } return a; } heap init ( int N ) { heap H; int i; H.size = N; H.array = (triple *)malloc((N+1) * sizeof(triple)); H.array[1].a = 0; H.array[1].b = 1; H.array[1].f = 0.0; for (i=2; i<=N; ++i) { H.array[i].a = 1; H.array[i].b = i; H.array[i].f = (double)1 / (double)i; } return H; } void heapify ( heap H, int i ) { int N, l, r, m; triple t; N = H.size; while (1) { l = 2*i; r = 2*i + 1; m = i; if (l > N) break; if (H.array[l].f < H.array[m].f) m = l; if ((l < N) && (H.array[r].f < H.array[m].f)) m = r; if (m == i) break; t = H.array[i]; H.array[i] = H.array[m]; H.array[m] = t; i = m; } } void makeheap ( heap H ) { int N, i; N = H.size; for (i=N/2; i>=1; --i) heapify(H,i); } heap insert ( heap H, triple abf ) { int N, i, p; triple t; N = ++(H.size); H.array[N] = abf; i = N; while (1) { if (i == 1) break; p = i / 2; if (H.array[p].f < H.array[i].f) break; t = H.array[i]; H.array[i] = H.array[p]; H.array[p] = t; i = p; } return H; } heap deletemin ( heap H ) { int N; N = H.size; H.array[1] = H.array[N]; --(H.size); heapify(H,1); return H; } void sortfractions ( heap H, int N ) { int a, b, c; double f; char str[20]; c = 0; while (H.size > 0) { a = H.array[1].a; b = H.array[1].b; f = H.array[1].f; ++c; sprintf(str, "%d / %d", a, b); printf("+++ Fraction No %3d : %8s = %17.15lf\n", c, str, f); H = deletemin(H); while (++a < b) { if (gcd(a,b) == 1) { f = (double)a / (double)b; H = insert(H,(triple){a,b,f}); break; } } } } int main ( int argc, char *argv[] ) { int N; heap H; if (argc > 1) N = atoi(argv[1]); else scanf("%d", &N); if (N<=0) N = 10; printf("N = %d\n\n", N); H = init(N); makeheap(H); sortfractions(H,N); exit(0); }