• ベストアンサー

因数分解のプログラム

皆さんごきげんよう。  3次式の因数分解をするプログラムを作っているのですが、3重解のときの求め方で困っています。 具体的には、 for(x=-100; x<101; x++){ if(a*x*x*x+b*x*x+c*x+d == 0){ printf("%d",x); } } このようにして、与式が0になるときにその値を出力しようと思うのですが、このやり方では、例えば(x-1)^3で、答えが"1"一つだけになってしまいます。この答えを、"1","1","1"としたいのです。  よろしくお願いします。

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

  • ベストアンサー
  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

微分を使います。 f = a*x*x*x + b*x*x + c*x + d を1回微分したもの f1 = 3*a*x*x + 2*b*x + c と、2回微分したもの f2 = 6*a*x + 2*b を求めます。 これを使って、次のように判断します。 f=0 and f1≠0 ⇒ 単解 f=0 and f1=0 and f2≠0 ⇒ 二重解 f=0 and f1=0 and f2=0 ⇒ 三重解

moomintroll
質問者

お礼

さっそくの回答ありがとうございます。  微分を使うとは、思いもよりませんでしたが、どうやらこの方法でできそうです。かなり悩んでいたので、とても助かりました。  ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.3

No.1です。 回答した直後に思いついたのですが、 手抜きな方法でよければ、 ・解が3つ見つかった -> 普通に3つ表示 ・解が1つしか見つからなかった -> 3重解(その解を3回表示) ・解が2つ見つかった -> その2点での導関数の値を計算 -> その値が0であったところが2重解 とすれば楽ですね。

moomintroll
質問者

補足

回答ありがとうございます。 この方法も考えたのですが、これだと(x-1)(x*x+2x+9)のようなときに解が1つしか見つからないので、うまくいきません。  解が2つのときはこの方法でいけそうですね。参考にさせてもらいます。  ありがとうございました。  

すると、全ての回答が全文表示されます。
  • hpsk
  • ベストアンサー率40% (48/119)
回答No.1

解はすべて -100 <= x <= 100 の整数、という仮定ですね。 多分、代入した結果が0になるところを探す、というだけではだめで、地道に多項式の除算などで因数分解しなければダメかと思います。 3重解なら、0になる点が1個しか見つからなかったら、それが3重解という判断が可能ですが、 2重解+もう1つの解、だとどちらか重解か判断できない気がします。

moomintroll
質問者

お礼

さっそくの回答ありがとうございます。解は-100から100までの整数という設定です。  shkwtaさんの方法でできそうですが、多項式の除算の方法も考えてみます。  ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A