信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1058:求一元二次方程
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1058:求一元二次方程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 24853 通過數: 3925
【題目描述】
利用公式,求一元二次方程ax2+bx+c=0的根,其中a不等于0。結果要求精確到小數點后5位。
【輸入】
輸入一行,包含三個浮點數a,b,c(它們之間以一個空格分開),分別表示方程ax2+bx+c=0的系數。
【輸出】
輸出一行,表示方程的解。
若兩個實根相等,則輸出形式為:“x1=x2=…”;
若兩個實根不等,在滿足根小者在前的原則,則輸出形式為:“x1=…;x2=…”;
若無實根輸出“No answer!”。
所有輸出部分要求精確到小數點后5位,數字、符號之間沒有空格。
【輸入樣例】
-15.97 19.69 12.02
【輸出樣例】
x1=-0.44781;x2=1.68075
【來源】
NO
代碼
#include <iostream> #include <cstdio> #include <cmath> #define precision_1 1e-12 #define precision_2 1e-6 using namespace std; int main () {double a,b,c,x1,x2,delta;cin>>a>>b>>c;delta=b*b-4*a*c;//判別式if(delta<0&&fabs(delta)>precision_1)//當判別式小于給定的精度范圍內,即delta<0時,無實根printf("No answer!\n");else if(fabs(delta)<precision_1)//當判別式小于給定的精度但>0,此時delta≈0{x1=-b/(2*a);if(fabs(x1)<precision_2) //超出所給的最小范圍,此時,視為delta=0,直接輸出0printf("x1=x2=%.5lf\n",0);else//未超出所給范圍時,結果仍在小數點后5位有效數字以內,輸出結果printf("x1=x2=%.5lf\n",x1);}else//delta>0時{x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);if(fabs(x1)<precision_2) x1=fabs(x1);//小于所給的最高精度,編譯系統視為-0,求絕對值if(fabs(x2)<precision_2) x2=fabs(x2);//小于所給的最高精度,編譯系統視為-0,求絕對值if(x1<x2)//x1、x2中小的數在前輸出printf("x1=%.5lf;x2=%.5lf",x1,x2);elseprintf("x1=%.5lf;x2=%.5lf",x2,x1);}return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1058:求一元二次方程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(C++)在线评测系统—
- 下一篇: 信息学奥赛一本通(C++)在线评测系统—