二次方程式? はい、つばを吐くだけです!

バイナリ検索を記述できるのはプログラマの10%だけであると考えられています 。 この意見は検証しませんが、二次方程式はどうでしょうか?



より具体的に問題を提起します:整数係数を持つax 2 + bx + c = 0の形式の2次方程式の解。 int内の3つの整数(係数a、b、c)が入力されます。 プログラムは常に結果を生成する必要があります。

些細なことのように思えますが、5分で完了です! そして、同じ5分後に、次のコード出力が得られます。
コード
int a, b, c; std::cin >> a >> b >> c; long long discriminant = b*b - 4*a*c; if (discriminant > 0) std::cout << "D > 0; 2 :\n" << "x1 = " << (-b + sqrt(discriminant))/(2*a) << "\n" << "x2 = " << (-b - sqrt(discriminant))/(2*a) << std::endl; else if (discriminant == 0) std::cout << "D = 0; 1 :\n" << "x = " << -1.*b/(2*a) << std::endl; else if (discriminant < 0) std::cout << "D < 0;  ." << std::endl;
      
      



すべてがクールですか? どんなに。 「顧客」である5年生のPetyaは不満です。プログラムは、「nan」と「inf」を発行して入力しました。

 0 -1 -1 D > 0; 2 : x1 = inf x2 = nan
      
      





肩をすくめ、縮退した場合の条件を追加します。
コード
 if (a == 0) { if (b != 0) std::cout << "a = 0;    :\n" << "x = " << -1.*c/b << std::endl; else if (c == 0) std::cout << "   ; x -  ." << std::endl; else std::cout << " ." << std::endl; } else { //  ,   . }
      
      



良くなっていますか? しかし、違います。
 1 0 -2 D > 0; 2 : x1 = 1.41421 x2 = -1.41421 49 7 -2 D > 0; 2 : x1 = 0.142857 x2 = -0.285714
      
      



そのような答えのために、ペティアは学校でscられました:ルートはルート、分数-分数のままでなければなりません。 私たちは頭の後ろをひっかいて、ため息をついてコードを引き受けます。 構造ごと、機能ごとに、10回ごとに膨張しますが、主な機能は大幅に重量が増えていますが、比較的変化していません。
コード
このステップのすべてのコード。

 if (a == 0) { if (b != 0) std::cout << "a = 0;    :\n" << "x = " << fraction(-c,b).toString() << std::endl; else if (c == 0) std::cout << "   ; x -  ." << std::endl; else std::cout << " ." << std::endl; } else { long long discriminant = b*b - 4*a*c; if (discriminant > 0) { std::cout << "D > 0; 2 :\n"; radical dRoot (discriminant); if (dRoot.isInteger()) { std::cout << "x1 = " << fraction(-b + sqrt(discriminant), 2*a).toString() << "\n" << "x2 = " << fraction(-b - sqrt(discriminant), 2*a).toString() << std::endl; } else { std::string rational = fraction(-b, 2*a).toString(), irrational = fraction(radical(discriminant), 2*a).toString(); if (rational == "0") std::cout << "x1 = " << irrational << "\n" << "x2 = " << "- " << irrational << std::endl; else std::cout << "x1 = " << rational << " + " << irrational << "\n" << "x2 = " << rational << " - " << irrational << std::endl; } } else if (discriminant == 0) std::cout << "D = 0; 1 :\n" << "x = " << fraction(-b, 2*a).toString() << std::endl; else if (discriminant < 0) std::cout << "D < 0;  ." << std::endl; }
      
      



 1 0 -2 D > 0; 2 : x1 = ┐/2 x2 = - ┐/2 49 7 -2 D > 0; 2 : x1 = 1/7 x2 = -2/7
      
      



Petyaは満足しています。Petyaは数学の5つを両親に、学校のチョコレートバーを1つ持ってきました。

5年が経ちました。 ピーターは10年生になりました。 そこで、代数の授業で、彼は虚数と複素数について話されました。 ディスク上のどこかでプログラムを掘り下げて、彼はその助けを借りて、悪役を試みます! -宿題をしてください。 しかし、それは何ですか?
 1 0 25 D < 0;  .
      
      



inしたピーターが私たちに修了プログラムをもたらします。 古いコードを数時間読んだ後、数行を追加することで問題が解決されていることがわかりました(正直なところ、私は自分でそれを期待していませんでした)。

コード
 if (discriminant != 0) { std::cout << "D != 0; 2 :\n"; radical dRoot (discriminant); if (dRoot.isInteger()) { std::cout << "x1 = " << fraction(-b + sqrt(discriminant), 2*a).toString() << "\n" << "x2 = " << fraction(-b - sqrt(discriminant), 2*a).toString() << std::endl; } else { std::string rational = fraction(-b, 2*a).toString(), irrational = fraction(radical(discriminant), 2*a).toString(); if (rational == "0") std::cout << "x1 = " << irrational << "\n" << "x2 = " << "- " << irrational << std::endl; else std::cout << "x1 = " << rational << " + " << irrational << "\n" << "x2 = " << rational << " - " << irrational << std::endl; } } else if (discriminant == 0) std::cout << "D = 0; 1 :\n" << "x = " << fraction(-b, 2*a).toString() << std::endl;
      
      





 1 0 25 D != 0; 2 : x1 = i*5 x2 = - i*5 1 2 53 D != 0; 2 : x1 = -1 + i*2┐/13 x2 = -1 - i*2┐/13
      
      





Petyaは5つの証明書を取得して高校を卒業し、名門大学に入学し、最初のセッションの後に飛び出します。

終わり。

最終コード。



All Articles