C言語関係掲示板

過去ログ

No.522.分数の割り算を求めるプログラム

[戻る] [ホームページ]
No.4088

分数の割り算を求めるプログラム
投稿者---weak(2002/12/27 16:54:10)


分数の割り算を求めるプログラムを作ってみたんですが、うまく作動しません。
どこがいけないのか意見を下さい。
#include <stdio.h>
struct frac_t
{
    int numerator; /*分子*/
    int denominator; /*分母*/
};
struct frac_t div(struct frac_t,struct frac_t);
void print(struct frac_t);
int gcd(int,int); /*最大公約数を求める*/
int main(void)
{
    struct frac_t f1,f2,f3;
    scanf("%d/%d",&f1.numerator,&f1.denominator);
    scanf("%d/%d",&f2.numerator,&f2.denominator);
    f3=div(f1,f2);
    print(f3);
    printf("\n");
    return 0;
}
struct frac_t div(struct frac_t f1,struct frac_t f2)
{
    struct frac_t fm;
    int div;
    fm.numerator=f1.numerator/f2.numerator;
    fm.denominator=f1.denominator/f2.denominator;
    div=gcd(fm.numerator,fm.denominator);
    fm.numerator /=div;
    fm.denominator /=div;
    return fm;
}    
void print(struct frac_t f)
{
    if(f.numerator > 0){
       if(f.denominator > 0){
          printf("%d/%d",f.numerator,f.denominator);
       }else{
          printf("-%d/%d",f.numerator,-f.denominator);
       }
    }else if(f.numerator < 0){
       if(f.denominator > 0){
          printf("-%d/%d",-f.numerator,-f.denominator);
       }else{
          printf("%d/%d",-f.numerator,-f.denominator);
       }
    }else{
          printf("0");
    }
}
int gcd(int m,int n)
{   
    int r;
    do{
      r = m % n;
      m = n;
      n = r;
    }while(r!=0);
    return m;
}

No.4094

Re:分数の割り算を求めるプログラム
投稿者---YY(2002/12/28 21:53:55)


> fm.numerator=f1.numerator/f2.numerator;
> fm.denominator=f1.denominator/f2.denominator;

上記のような方法は誤りです。
例えば、f1 = 1/2, f2 = 3/4の場合、fmの分子と分母はそれぞれ、
(分子) = 1/3 = 0; (分母) = 2/4 = 0;
となってしまうからです。分子と分母をint型で持っているわけだから、
割り算は使ってはいけません。そのための、gcdなのですから。

No.4112

Re:分数の割り算を求めるプログラム
投稿者---cross-over(2002/12/29 23:01:54)


ではどのようにすればよいのでしょうか。

No.4114

Re:分数の割り算を求めるプログラム
投稿者---YY(2002/12/30 03:07:21)


weakさん==cross-overさん?

それはさておき、
>割り算は使ってはいけません。そのための、gcdなのですから。
というのがヒントだったのですが、わかりにくかったですかね。
では、あらためて。

・割り算を使わない -> (a/b)÷(c/d) = (a/b)×(d/c)
・分子、分母を計算後、約分(これは元のソースと同じ)

No.4116

Re:分数の割り算を求めるプログラム
投稿者---カンナ(2002/12/30 15:52:45)
http://hana.sakura.ne.jp/~elfin/k/


>・割り算を使わない -> (a/b)÷(c/d) = (a/b)×(d/c)
>・分子、分母を計算後、約分(これは元のソースと同じ)

 オーバーフローを避けるために計算前にaとc・bとdで約分しておくと
more betterかと思います(a/b・c/dで約分しておくのは当然として)。
それでもオーバーフローしてしまうなら、そもそも避けようがありませ
んしね。