// ²òÅú4.5 frac2.c #include #include #include #define INT uint64_t #define E8 (10000LL*10000) /* 1E8 */ #define E12 (10000LL*E8) /* 1E12 */ #define ROUND typedef struct fraction { INT num; INT dom; } Fraction; INT gcd(INT,INT); void set_fraction(INT, INT, Fraction *); void add_fraction(const Fraction *,const Fraction *, Fraction *); void copy_fraction(const Fraction *, Fraction *); void print_fraction(const Fraction *); INT gcd(INT p, INT q) { while(q>0) { INT r = p%q; p = q; q = r; } return p; } void set_fraction(INT x, INT y, Fraction *f) { INT d = gcd(x,y); f->num = x/d; f->dom = y/d; } void add_fraction(const Fraction *a,const Fraction *b, Fraction *c) { INT num = a->num ; INT dom = a->dom ; #ifdef ROUND #define LIM E12 while (num > LIM && dom > LIM) { num = (num+5)/10; dom = (dom+5)/10; } #endif INT d = gcd(dom, b->dom); INT x = num * b->dom/d + b->num * dom/d; INT y = dom * b->dom/d; set_fraction(x, y, c); } void copy_fraction(const Fraction *a, Fraction *b) { b->num = a->num; b->dom = a->dom; } void print_fraction(const Fraction *f) { // printf("%12u/%12u", f->num, f->dom); // for uint32_t printf("%20llu/%20llu", f->num, f->dom); // for uint64_t } Fraction fx, fy, fz; int main() { int n; double r0=0.0, r1; scanf("%d", &n); set_fraction(0,1,&fx); for (int i=1;i<=n;i++) { set_fraction(1, i*i, &fy); add_fraction(&fx,&fy,&fz); copy_fraction(&fz,&fx); printf("%3d:",i); print_fraction(&fx); printf("=%12.10f\n", r1=(double)fx.num/fx.dom ); if (r0 > r1) { printf("error\n"); return 1; } r0 = r1; } return 0; }