一本通題庫 1058:求一元二次方程


  其實在這一章里面大部分的題做的都是很順暢的,直到遇到了最后一個題——也就是這個解一元二次方程組的題。這個題打眼一看其實挺簡單的,只是要考慮三種情況——∆<0,∆>0,∆=0;可是實際操作時發現遠不止這么簡單。這個題一開始我提交了一次有檢查了一遍,結果把錯誤改好后發現總是有一個檢查點錯誤。從網上搜索后才發現,c++有一個精度問題——當讀取的數字超出設定精度時,會讀取為-0.這就要求我們在程序中要考慮超出設定精度的情況。

  判斷精度時,因為∆有正有負,所以要用到絕對值。我們平常用的絕對值都是abs(),而因為這里是小數,所以要用到小數的取絕對值函數——fabs()。

  通過完成這個題,我真是學到了不少我以前沒想過的知識。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define xiao 0.000000000001//設定delta的精度,可根據需要更改
 4 #define xi 0.000001 //設定x的精度(因為delta要開方,精度會減小,所以x的精度判斷也要減小。) 

5 int main()
6
{
7
double a,b,c,x[2],dt; 8 cin>>a>>b>>c; 9 dt=b*b-4*a*c; 10 if(dt<0&&fabs(dt)>xiao)//判斷delta是否小於零
11     {
12         cout<<"No answer!";
13         return 12;
14     }
15     else if(fabs(dt)<xiao)//如果delta小於設定精度,此時delta約等於零,當做delta等於零。
16     {
17         x[0]=(-b)/2/a;
18         if(fabs(x[0])>xi)
19         {
20             printf("x1=x2=%.5lf",x[0]);
21         }
22         else
23         {
24             printf("x1=x2=%.5lf",0);//如果x超出設定精度,此時x約等於零,當做x等於零。
25         }
26     }
27     if(dt>xiao)
28     {
29         x[0]=(-b+sqrt(dt))/2/a;
30         if(fabs(x[0])<xi)
31         {
32             x[0]=fabs(x[0]);//如果x超出設定精度,此時x會被視為-0,要加絕對值
33         }
34         x[1]=(-b-sqrt(dt))/2/a;
35         if(fabs(x[1])<xi)
36         {
37             x[1]=fabs(x[1]);//同上
38         }
39         sort(x,x+2);
40         printf("x1=%.5lf;x2=%.5lf",x[0],x[1]);
41     }
42     return 0;
43 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM