其实在这一章里面大部分的题做的都是很顺畅的,直到遇到了最后一个题也就是这个解一元二次方程组的题。这个题打眼一看其实挺简单的,只是要考虑三种情况∆<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//设定delta的精度,可根据需要更改
#define xi 0.000001 //设定x的精度(因为delta要开方,精度会减小,所以x的精度判断也要减小。)

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)//判断delta是否小于零
{
cout<<"No answer!";
return 12;
}
else if(fabs(dt)<xiao)//如果delta小于设定精度,此时delta约等于零,当做delta等于零。
{
x[0]=(-b)/2/a;
if(fabs(x[0])>xi)
{
printf("x1=x2=%.5lf",x[0]);
}
else
{
printf("x1=x2=%.5lf",0);//如果x超出设定精度,此时x约等于零,当做x等于零。
}
}
if(dt>xiao)
{
x[0]=(-b+sqrt(dt))/2/a;
if(fabs(x[0])<xi)
{
x[0]=fabs(x[0]);//如果x超出设定精度,此时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;
}