/*分数ライブラリ*/ #ifndef YAMAGIWA_FRAC #define YAMAGIWA_FRAC #include #include typedef struct fraction{ int numerator; int denominator; }FRAC; /*最大公約数*/ int gcd(int m,int n){ if(m<=0 || n<=0)return 0; if(mnumerator); } /*分母取得*/ int getDenom(FRAC * a){ return (a->denominator); } /*約分*/ FRAC* reduce(FRAC* a){ int d = gcd(a->numerator,a->denominator); if(d==0)return NULL; a->numerator /= d; a->denominator /= d; /*分母が負のとき分子分母に-1をかける*/ if(getDenom(a)<0){ a->numerator *= -1; a->denominator *= -1; } return a; } /*値を設定*/ FRAC setFrac(int num,int denom){ FRAC temp; temp.numerator=num; temp.denominator=denom; reduce(&temp);/*約分*/ return temp; } /*整数を分数変数へ変換*/ FRAC *int2Frac(int n){ static FRAC c; c = setFrac(n,1); return &c; } /*有理数を分数変数へ変換*/ FRAC *double2Frac(double r){ static FRAC c; int t=1;/**/ while(r-(int)r != 0){ r*=10; t*=10; } c = setFrac((int)r,t); return &c; } /*表示*/ void showFrac(FRAC* a){ printf("%d/%d",a->numerator,a->denominator); } /*浮動小数点で表す*/ double frac2Double(FRAC* a){ assert(a->denominator!=0); //if(a->denominator!=0) abort();/*0割終了*/ return ((double)(a->numerator)/(a->denominator)); } /*足し算*/ FRAC addFrac(FRAC *a,FRAC *b){ FRAC c; int na = getNume(a); int nb = getNume(b); int m = getDenom(a); if(getDenom(a)!=getDenom(b)){ m = lcm(getDenom(a),getDenom(b)); na = getNume(a) * m/getDenom(a); nb = getNume(b) * m/getDenom(b); } c = setFrac(na+nb,m); reduce(&c); return c; } FRAC difFrac(FRAC *a,FRAC *b){ FRAC c; int na = getNume(a); int nb = getNume(b); int m = getDenom(a); if(getDenom(a)!=getDenom(b)){ m = lcm(getDenom(a),getDenom(b)); na = getNume(a) * m/getDenom(a); nb = getNume(b) * m/getDenom(b); } c = setFrac(na-nb,m); reduce(&c); return c; } /*掛け算*/ FRAC multiFrac(FRAC *a,FRAC *b){ FRAC c; c = setFrac(getNume(a)*getNume(b),getDenom(a)*getDenom(b)); reduce(&c); return c; } /*割り算*/ FRAC divFrac(FRAC *a,FRAC *b){ FRAC c; c = setFrac(getNume(a)*getDenom(b),getDenom(a)*getDenom(b)); reduce(&c); return c; } /*比較 aが大きければ正,bが大きければ負,等しければ0を返す*/ double compFrac(FRAC *a,FRAC *b){ FRAC c; double r; c=difFrac(a,b);/*差*/ r=frac2Double(&c); return r; } #endif