• ベストアンサー

2次方程式の解の表示

次のプログラムが出来ません。 二次方程式の係数a,b,cを順に実数で入力したとき、2次方程式の解を出力。虚数解はそれらしく表示。 単純に考えると解の公式に当てはめる、というものですが、きれいに表示しようとすると、かなりの手間になります。 なんとか効率よく表示まで行える方法はありませんか? Cで簡単な関数のみで出来ると思います。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

自ら「簡単な関数のみでできると思います」と言っているのならなぜ書かないんだろうと思いつつ. #include <stdio.h> #include <math.h> int main() { double a, b, c; scanf("%lf%lf%lf", &a, &b, &c); b /= 2; double d = b*b-a*c; double x = -b/a; double y = fabs(sqrt(fabs(d))/a); if (d > 0) { double x1 = (x > 0) ? x+y : x-y; double x2 = c / (a*x1); printf("Two real zeros: %lf and %lf\n", x1, x2); } else if (d < 0) { printf("Two complex zeros: %lf +/- i%lf\n", x, y); } else { printf("Double zero: %lf\n", x); } return 0; }

shiro0102
質問者

お礼

有難う御座います。 途中までは考える事が出来たのですが、あまりに自分のプログラムの効率の悪さに、諦めてしまいました。 参考にして頑張ってみようと思います。

その他の回答 (3)

回答No.4

#3さんのプログラムを参考にして、#2さんのような出力結果がでるようにしてみました。もっときれいなプログラムになるとは思いますが、参考にしてみて下さい。 #include<stdio.h> #include<math.h> int main(){ int x,y,z; int a,b,c; scanf("%d%d%d",&x,&y,&z); a=-1*y; b=y*y-4*x*z; c=2*x; printf(" -%d",a);if(b==0){printf("\n");}else{printf("±");matome(b);} printf(" --------\n"); printf(" %d \n",c); } matome(int k){ int i,j; if(k<0){ k=-1*k; for(i=(int)sqrt(k);i>=1;i--){ if(k%(i*i) == 0)break; } j=k/(i*i); printf("%d√%d",i,j);printf("i\n"); }else{ for(i=(int)sqrt(k);i>=1;i--){ if(k%(i*i) == 0)break; } j=k/(i*i); printf("%d√%d\n",i,j); } } 2次方程式の解を値として必要なプログラムならば#1さん ようにしなけれいけないんだけど、解を表示するだけならこっちほうが見た目わかりやすと思います。

shiro0102
質問者

お礼

アドバイス有難う御座います。 参考プログラムまで作って頂いて本当に助かります。 ちゃんと自分で理解して、プログラムを作ってみようと思います。 それでは。失礼致します。

  • togino
  • ベストアンサー率75% (97/129)
回答No.3

> そこまで考えたんですけど、√の中身まで出せるでしょうか? どうして出来ないと思われるんでしょ? もしあなたが、√72 を 6√2 に変形出来ないのなら しかたないですがね (^^;) shiro0102 さんは、計算する時、ある一定の手順に従っていません? その手順どおりにプログラムすればいいわけです。 √c = a√b になるとすると c = a * a * b ということですので、これを満たす最大の a を見つければいいわけです。 下記のプログラムは逐一調べていくので非効率ですが・・・ int a, b, c; c = 72; for(a = (int)sqrt(c); a >= 1; a --){  if(c % (a * a) == 0) break; } b = c / (a * a); printf("√%d = %d√%d\n", c, a, b); # あっ、あくまで整数の世界の話です # 実数なら、分数(分母と分子)に分けて # 計算しなくてはなりません

shiro0102
質問者

お礼

有難う御座います。 そうですね、そのようにすれば求めることができるのですね… まだプログラミングを始めて日が浅いので、自分でプログラムを生かすことが上手く出来ません。 プログラムの世界は広いのですね… それでは、有難う御座いました。課題提出まで、頑張ってみたいと思います。

  • togino
  • ベストアンサー率75% (97/129)
回答No.2

「そらしく表示」っていうのは 例えば     5±2√3i ─────  7 と表示させるとかいうことでしょうか?

shiro0102
質問者

補足

そうですね。分数は/でも構わないと思います。 そこまで考えたんですけど、√の中身まで出せるでしょうか?私では考えられませんでした。

関連するQ&A

  • 三次方程式

    三次方程式の解を求める方法を探しているのですが、 カルダノの公式だと解が実数解の場合にも、虚数解がでてしまうらしいので、カルダノの公式以外で実数解を求める方法はないのでしょうか?(実数解のみを持つ方程式でカルダノの公式を用いると実数解と虚数解で解が5つでるということがよくわかりませんが・・・)  自分はC言語でプログラムをしたいので、高校数学のように最初一つは適当に代入するという方法は使いたくありません。 よろしくお願いします。

  • 4次方程式の解

    x^4-4x-1=0 の実数解と虚数解を求めよ。 因数定理は使えない。 (x^2+ax+b)(x^2+cx+d)=0 と与式をおく。a,b,c,dは実数 展開して、係数を比較すると (1)bd=-1 (2)a+c=0 (3)ac+b+d=0 (4)ad+bc=-4 これから、a,b,c,dを求めてと思いましたが、できませんでした。 (1)から(4)の式から1つの文字だけの方程式はできるが、それが解けない。 かえって、与方程式を解くよりむずかしい。 よろしくアドバイスおねがいします。

  • 二次方程式で実数解が無いとは解が無いとは言ってない

    y=ax^2+bx+cの二次方程式の話ですが、解の公式のb^2-4acでマイナスの数になるとルートが取れなくて「実数解なし」ってなりますよね。 でも、実数解が無いって言ってるだけで本当は解があるのかなぁ・・・、と疑問です。 なんだかiとかって虚数?があるのは知ってますが、そういうので何か実数ではない解が出せるのでしょうか。仮に出せるとして、それはいったいどういう意味を持つのですか。 数学は中3~高1レベルだと思いますm(_ _)m 計算方法はそんなに理解できないと思うので本質が気になっています。解とは何?とか。

  • 2次方程式の解の公式

    こんばんは。ただいま新課程「数(2)」啓林館の高次方程式の「解の公式・判別式」の部分の学習指導案を書いています。単元設定の理由という部分がうまく書けません。「今までは実数の範囲で考えていたため2次方程式の解の公式ではb^2-4acが0以上の時実数解を持ちb^2-4acが0未満のとき実数解をもたなかった。今ここで複素数の範囲まで数を拡張するとb^2-4acが0未満のとき虚数解をもち,2次方程式は常に解を持つことを理解させる」また「判別式を用いると直接解を求めなくても解の種類がわかったり、2次関数とx軸の位置関係がわかることを理解させる」としましたがしっくりしません。アドバイス等をお願いします

  • フェラーリの方法・四次方程式の解の公式について

    今現在解きたい四次方程式があるのですが、係数に虚数が含まれており、苦戦しております。 簡単に記すと以下のように表せます。 x^4+a*i*x^3+b*x^2+c*i*x+d=0 (見づらくてすいません) つまり第二項と第四項に虚数が含まれている状態です。 係数に虚数がある場合解の公式が使用可能でしょうか? またできない場合は他の四次方程式の解の導出方法を教えていただきたいです

  • 三次方程式の解法について

    三次方程式を解くプログラムを作成したいです。 三次方程式a*x3+b*x2+c*x+d=0を解くのに, カルダノの公式がありますが,解が全て実数解であるとしても, 計算過程で虚数が存在することを考えなければなりません。 しかし,a=1で解が実数解の場合, 計算過程で虚数を考えなくても,簡単に実数解を求める ことができる(エクセルで簡単に)と聞きました。 ニュートン法等の収束計算を用いる方法ではないようです。 このような方法をご存知でしたら,詳しく教えてください。 よろしくお願いいたします。

  • Mathematicaでの連立方程式

    MathmaticaでNSolveを用いて,連立方程式を解こうとしています. 得られた解が実数の場合,虚数の場合の2つでIf文による条件分岐を行いたいです. 例えば,  解が実数の時,値をファイルに出力する  解が虚数の時,値をファイルに出力しない このとき,解が実数であるか,虚数であるかをプログラムで判断するにはどうすれば良いでしょうか? 目視の場合は,iがあるか,ないかで判断できるのですが,プログラムとして実施する方法を教えて頂きたいです. よろしくお願い致します.

  • 二次方程式の解について。

     二次方程式が実数の範囲で解を持つか、または複素数の範囲で解を持つかは、二次方程式の解の公式の「判別式」で判断することができますよね。  そこで、この判別式を使って、二次方程式の解が実根になる確率と虚根になる確率と、どっちが大きいのか考えてみました。  まず、簡単にするために二次方程式  ax^2+bx+c=0  の両辺をaでわって、新しくできる係数をp,qとします。そうしてできた二次方程式の判別式は  p^2-4q  となりますよね。この判別式が0に等しいとして、この式を変形していきます…  p^2-4q=0  4=p^2/q  つまり数直線で考えると、p^2/qが丁度4になったとき二次方程式は一つの解しか持たないことになります(重根でしたか?)。同様に考えると(-∞,4)の範囲で二次方程式は虚根を、(4,∞)の範囲で二次方程式は実根をもつはずです。  そう考えると、虚根を持つ範囲の方が4つ分広いので確率が高いとおもったのですが、どうなるのでしょうか?  それとも、私の考え方がどこか間違っていたのでしょうか?

  • 虚数が係数の2次方程式の解

    ix^2+x=0という2次方程式について、x=-1/iも解になるんじゃないかと思ったのですが、これが違うのはそもそも1/iというのは定義的に存在しないからなのでしょうか? また、以前こちらのサイトで、2次方程式の解の公式は虚数が係数の場合でも成り立つか、という質問をした際、成り立つという回答をいただいたのですが、これは間違いだったということでしょうか?

  • 2次方程式。解と係数の関係の問題

    「2次方程式x^2+ax+b=0が0でない解α、Βをもち、α^2+Β^2=3、1/α+1/Β=1が 成り立つとき、実数a、bの値を求めよ」という問題ですが、 解と係数の関係より、α+Β=-a、αΒ=b よって、α^2+Β^2=(α+Β)^2-2αΒ=a^2-2b=3 1/α+1/Β=(α+Β)/αΒ=-a/b=1より、(a、b)=(-3、3)、(1、-1)と計算できます。 答えも(a、b)=(-3、3)、(1、-1)となっていますが、 実際に(a、b)を使ってできる2次方程式は、 x^2-3x+3=0・・・・・(1)、x^2+x-1=0・・・・・(2)の2つで、 (1)について解くとx=(3±√-3)/2、(2)ついて解くとx=(-1±√5)/2となり、(1)が虚数解と なりますが、問題で、0でない実数解α、Βをもつとなっているので、虚数解でも問題ないとのこと でしょうか? ちなみに、(1)の解だと1/α+1/Β=1は成り立ちません。 α=3+√-3、Β=3-√-3とおいて、 1/(3+√-3)/2+1/(3-√-3)/2=2/(3+√-3)+2/(3-√-3)(有理化?)して (2(3-√-3)+2(3+√-3))/(3-√-3)(3+√-3)=(6+6)/(9-3)=2で成り立ちません。 出展:武蔵工大

専門家に質問してみよう