- ベストアンサー
2次方程式の解の表示
次のプログラムが出来ません。 二次方程式の係数a,b,cを順に実数で入力したとき、2次方程式の解を出力。虚数解はそれらしく表示。 単純に考えると解の公式に当てはめる、というものですが、きれいに表示しようとすると、かなりの手間になります。 なんとか効率よく表示まで行える方法はありませんか? Cで簡単な関数のみで出来ると思います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
自ら「簡単な関数のみでできると思います」と言っているのならなぜ書かないんだろうと思いつつ. #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; }
その他の回答 (3)
- michisanpo
- ベストアンサー率36% (7/19)
#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さん ようにしなけれいけないんだけど、解を表示するだけならこっちほうが見た目わかりやすと思います。
お礼
アドバイス有難う御座います。 参考プログラムまで作って頂いて本当に助かります。 ちゃんと自分で理解して、プログラムを作ってみようと思います。 それでは。失礼致します。
- togino
- ベストアンサー率75% (97/129)
> そこまで考えたんですけど、√の中身まで出せるでしょうか? どうして出来ないと思われるんでしょ? もしあなたが、√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); # あっ、あくまで整数の世界の話です # 実数なら、分数(分母と分子)に分けて # 計算しなくてはなりません
お礼
有難う御座います。 そうですね、そのようにすれば求めることができるのですね… まだプログラミングを始めて日が浅いので、自分でプログラムを生かすことが上手く出来ません。 プログラムの世界は広いのですね… それでは、有難う御座いました。課題提出まで、頑張ってみたいと思います。
- togino
- ベストアンサー率75% (97/129)
「そらしく表示」っていうのは 例えば 5±2√3i ───── 7 と表示させるとかいうことでしょうか?
補足
そうですね。分数は/でも構わないと思います。 そこまで考えたんですけど、√の中身まで出せるでしょうか?私では考えられませんでした。
お礼
有難う御座います。 途中までは考える事が出来たのですが、あまりに自分のプログラムの効率の悪さに、諦めてしまいました。 参考にして頑張ってみようと思います。