• ベストアンサー

因数分解プログラム(C言語)について(3)

つづきです /*求めた最大公約数で約分*/ if(*flag == 1){ *d = *m1 / *i; *e = *n1 / *i; } else{ printf("約分できません。\n"); *d = *m1; *e = *n1; } return 0; } int yakubun2(int *m2,int *n2,int *min2,int *flag,int *i,int *f,int *g) { /*最大公約数を見つける*/ if(*m2 < *n2){ *min2 = *m2; } else{ *min2 = *n2; } *flag = 0; for(*i = min2; *i > 0; *i--){ if(*m2 % *i == 0){ if(*n2 % *i == 0){ *flag = 1; break; } } } /*求めた最大公約数で約分*/ if(*flag == 1){ *f = *m2 / *i; *g = *n2 / *i; } else{ printf("約分できません。\n"); *f = *m2; *g = *n2; } return 0; } /*因数分解の結果を表示*/ int output(int *d,int *e,int *f,int *g) { printf("(%dχ-%d)(%dχ-%d)",*d,*e,*f,*g); return 0; } 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=474597

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

  • ベストアンサー
noname#30727
noname#30727
回答No.6

>それから、変数iとflag以外にも あとは、min1 と min2 だけでしょうか。 課題という事なので、プログラムが正しく動いているかどうかは試していませんが、全体を見て気になった事を・・・ yakubun1 と yakubun2 は同じ内容なので1つにまとめた方がいいです。これについては、bunkai1 と bunkai2 にも同じことが言えます。 1つにまとめると、試行錯誤している段階での修正量が減り、修正ミスも減ります。そして、C 言語の関数への理解度が高い事をアピールできます。 私の場合、ポインタを使って値を返す時、その変数を前に持ってくる事が多いですが、決まりというわけではないです。 yakubun(&d, &e, m1, n1); yakubun(&f, &g, m2, n2); void yakubun(int *rm, int *rn, int m, int n) { int i; int flag; int min; /* 以下省略 */ }

1724
質問者

お礼

お陰様で、まとまりのあるプログラムになりました。 ありがとうございました。

その他の回答 (6)

  • jmh
  • ベストアンサー率23% (71/304)
回答No.7

> pは、どのようにプログラムで記述すればいいのですか? aX^2+bX+c=p(qX-r)(sX-t) の右辺を展開、 係数比較で、a=pqsを得ます。つまりp=a/q/sです。 c.f. 469180 の /* 割り切れるはず */ のところ。 ただし「割り切れるはず」かどうかに自信がなければ、割る前に調べた方がよいです。

1724
質問者

お礼

お陰様で無事できました。 ありがとうございました。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.5

前回は、特に指摘しなかったのですが、 普通、6X^2+28X+16を因数分解すると、  2(X+4)(3X+2) ですよね? 一般に、aX^2+bX+cがもし因数分解できれば、  p(qX-r)(sX-t) の形になると思います。 つまり、最後の printf は、   printf("%d(%dX-(%d))(%dX-(%d))", ...); だと思いますよ。

1724
質問者

補足

jmhさん、アドバイスありがとうございます。 確かにおっしゃられた通りです。 直したプログラムで6X^2+28X+16を因数分解したら、 (X+4)(3X+2) になってしまいました。 pは、どのようにプログラムで記述すればいいのですか? 今一、ピンときません。 よろしかったら、ご教授ください。お願いします。

noname#30727
noname#30727
回答No.4

#1, #2 の方の回答とも関連しますが、 プロトタイプ宣言→ int judge(int *,int *,int *); 呼び出し→ judge(&a,&b,&c); 関数の定義→ int judge(int *a,int *b,int *c,float *D) になっているので、コンパイルが通ってしまったとしても、D が不定になります。 #3 の方の回答への補足ですが、 >for(*i = *min2; *i > 0; *i--){ *i-- は演算子の優先度から、(*i)-- としないと目的の結果にはならないので、このあたりは注意が必要です。 ポインタがよくわからないということですが、必要のないポインタを乱用していることが原因です。 関数 judge を例に、普通の呼び出し方を考えてみましょう。 /*因数分解できるか判断する関数*/ float judge(int a,int b,int c) { float D; D = b * b - 4 * a * c; if(D > 0 || D ==0){ printf("判別式は条件を満たしました。\n因数分解を行います。\n"); } else if(D < 0){ printf("判別式はD < 0であるため、因数分解できません。\n"); exit(1); } return D; } int main(void) { ... D = judge(a, b, c); ... } ポインタは必要のないときには使わない方が誰にとっても見やすいです。 関数 main の中で全ての変数を定義するようなやりかたは良くないので、その関数だけで必要な変数は、その関数で定義するようにします。 関数 input などは、入力された値3つを main に返す必要があるから、今のままでいいのですが、特に返す値の無い関数は、戻り値の型を void としたほうが良いでしょう。

1724
質問者

補足

皆さん、アドバイスどうもありがとうございます。 inthefloiさんのアドバイスを参考にして 前よりはプログラムが良くなりました。 しかし、まだ不具合がある感じです。 それから、変数iとflag以外にも ローカル変数でもプログラムに支障がない変数 (ポインタである必要がない変数)を 教えては頂けないでしょうか? お願いします

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.3

アルゴリズムは見ていませんが、ポインタを見たところ... (2)の for(*i = min1; *i > 0; *i--){ は for(*i = *min1; *i > 0; *i--){ (3)の for(*i = min2; *i > 0; *i--){ は for(*i = *min2; *i > 0; *i--){ だと思います。 ちなみに素因数分解のプログラムは http://www.okweb.ne.jp/kotaeru.php3?q=429203 の#4にあります。こちらも参考にしてはどうでしょう

1724
質問者

お礼

nitscapeさん、ありがとうございました。 参考にさせていただきました。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

とりあえず気づいたところ。 (2)の判別式の判定に、*D でなく D を使っているところ。 *D<0 でも終了しないので、*q = sqrt(*D); で落ちるでしょうね。 環境がわかりませんが、デバッガを使うようにしてください。 そうすれば、どこがおかしいかトレースできます。 頑張って下さい。

1724
質問者

補足

MovingWalkさん、ありがとうございます。 おっしゃられた通りでした。

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.1

if(D > 0 || D ==0){ printf("判別式は条件を満たしました。\n因数分解を行います。\n"); } else if(D < 0){ ここは、 *D = (float)((*b) * (*b)) - (4 * (*a) * (*c)); if(*D > 0 || *D ==0){ printf("判別式は条件を満たしました。\n因数分解を行います。\n"); } else if(*D < 0){ ではないでしょうか? printf

1724
質問者

お礼

uyama33さん、ありがとうございます。 参考にさせていただきました。

関連するQ&A