import std.string; template Zero (T) { T zero () { return T.init; } T one () { return zero()+1; } } template Zero(T:float) { T zero() { return 0; } T one () { return zero()+1; } } template Zero(T:double) { T zero() { return 0; } T one () { return zero()+1; } } template Zero(T:real) { T zero() { return 0; } T one () { return zero()+1; } } struct BigRational(T, int rat) { private: T n; T d; static T int_gcd_recurse (T less, T more) { T zero = Zero!(T).zero(); T amb = more%less; if (amb==zero) { return less; } return int_gcd_recurse(amb,less); } static T int_abs (T a) { T zero = Zero!(T).zero(); return ar) return 1; return 0; } BigRational print() { //printf ("%d/%d=",cast(int)n,cast(int)d); BigRational r=*this; r.Rationalize(); char * num=std.string.toStringz(std.string.toString(r.n)); char * den=std.string.toStringz(std.string.toString(r.d)); printf ("%s/%s",num,den); //printf ("=%d/%d",cast(int)n,cast(int)d); return *this; } } alias BigRational!(long,0) Rational;