• ベストアンサー

簡単な割り算プログラムとprintfについて。

趣味のプログラミングで二つの整数x, yの割り算結果x/yを分数(約分も行う)、または少数で表示するプログラムを作成中です。 分子が1になる場合は分数、それ以外は少数で表示しなくてはなりません。 しかし、 二つの整数が1, 111の場合など、割り算の結果が無限少数になってしまう場合は、 1/111と表示しなくてはいけません。 例) x = 100, y = 200, kekka = 1/2 x = 4, y = 5, kekka = 0.8 x = 1, y = 111, kekka = 1/111 わたしは初めに、x ,yを比較してxのほうが大きい、または最大公約数がxと等しい場合はx/yを少数で表示し、 それ以外なら最大公約数で両方を割って分数で表示、という風に考えていましたが、 条件の無限小数の判定の方法がどうしても分かりません。 また、もし結果が0.0003などの場合、printf("%.4f", kekka); と書けば、0.0003とキレイに表示されますが、 printf("%f", kekka);のままでは、0.000300とゼロが余計に表示されてしまいます。 この桁数指定を引数などで与える方法が分かりません。 もしお詳しいかたいらっしゃいましたら、ご教授ください。 よろしいお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>条件の無限小数の判定の方法がどうしても分かりません。 桁に制限が付きますが次の方法が一番簡単に判定できると思います。 if( x * 1000000 % y == 0 ) >この桁数指定を引数などで与える方法が分かりません。 ご希望の処理方法とは違いますが、 %fではなく、%gにすると桁数指定をするまでもなく0が消えます。 また、引数を指定することにこだわるなら、 char c[10] = "%.5f"; c[2] = '3'; printf( c, 0.005f ); 実行結果 0.005 のような書き方もあります。

sakikomait
質問者

お礼

ご回答ありがとうございました。 とても勉強になりました。

その他の回答 (1)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> 条件の無限小数の判定の方法がどうしても分かりません。 約分した後の分母を素因数分解して、 2か5以外の因数が有れば無限小数。 (実際に素因数分解しなくても、 2または5で割る操作を余りが出ない間繰り返して商が1になるかという判定で良さそう。) > また、もし結果が0.0003などの場合、printf("%.4f", kekka); と書けば、0.0003とキレイに表示されますが、 > printf("%f", kekka);のままでは、0.000300とゼロが余計に表示されてしまいます。 > この桁数指定を引数などで与える方法が分かりません。 たしかアスタリスクを使って、  printf("%.*f", kekka, prec); とすれば引数で精度指定ができたと思う。 もしくは面倒だけど、printfの%f指定子に頼らずに、 分母が10の倍数になるように分母・分子に同じ数をかけた後、 分子を文字列に変換し適切な位置に小数点を入れるという手順でもできなくはないか。

sakikomait
質問者

お礼

ご回答ありがとうございました。 とても勉強になりました。

関連するQ&A