其实在这一章里面大部分的题做的都是很顺畅的,直到遇到了最后一个题也就是这个解一元二次方程组的题。这个题打眼一看其实挺简单的,只是要考虑三种情况∆<0,∆>0,∆=0;可是实际操作时发现远不止这么简单。这个题一开始我提交了一次有检查了一遍,结果把错误改好后发现总是有一个检查点错误。从网上搜索后才发现,c++有一个精度问题当读取的数字超出设定精度时,会读取为-0.这就要求我们在程序中要考虑超出设定精度的情况。
判断精度时,因为∆有正有负,所以要用到绝对值。我们平常用的绝对值都是abs(),而因为这里是小数,所以要用到小数的取绝对值函数fabs()
通过完成这个题,我真是学到了不少我以前没想过的知识。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<bits/stdc++.h>
using namespace std;
#define xiao 0.000000000001 #define xi 0.000001
int main() { double a,b,c,x[2],dt; cin>>a>>b>>c; dt=b*b-4*a*c; if(dt<0&&fabs(dt)>xiao) { cout<<"No answer!"; return 12; } else if(fabs(dt)<xiao) { x[0]=(-b)/2/a; if(fabs(x[0])>xi) { printf("x1=x2=%.5lf",x[0]); } else { printf("x1=x2=%.5lf",0); } } if(dt>xiao) { x[0]=(-b+sqrt(dt))/2/a; if(fabs(x[0])<xi) { x[0]=fabs(x[0]); } x[1]=(-b-sqrt(dt))/2/a; if(fabs(x[1])<xi) { x[1]=fabs(x[1]); } sort(x,x+2); printf("x1=%.5lf;x2=%.5lf",x[0],x[1]); } return 0; }
|