求二元一次方程的解,
ax+by=c
dx+ey=f
输入格式:
在一行中给出a、b、c、d、e、f的值,都为整数。
输出格式:
无数解,输出0 0
;无解输出-1 -1
;有解,输出x、y的解,保留两位小数。
样例">输入样例:
2 3 5 1 -4 7
输出样例:
3.73 -0.82
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
使用韦达定理(Viete's formulas)或称作韦伯定理(Vieta's formulas)来完成。韦伯定理指出,对于二元一次方程组:它的两个根 x 和 y 可以表示为:
因此,只需要计算 ae−bd 是否为零,如果不是,则用上述公式计算出 x 和 y 的值,并输出结果;否则,需要进一步判断是否有无数解。
首先定义六个整型变量a,b,c,d,e,f,并计算出 ae−bd 的值。然后进行判断:如果,则按照韦伯定理计算出 x 和 y 的值并输出;否则,需要进一步判断是否有无数解或者无解。无数解的条件是 ce=bf 且 af=cd,因此判断是否成立即可输出 0 0
。如果不是无数解,则只可能是无解,输出 -1 -1
。在输出浮点数时,题目要求保留小数点后 2 位,因此在 printf
函数中使用格式化字符串 "%.2f"
可以实现这个功能。或者无解。
代码:
int main()
{
int a, b, c, d, e, f;
int ae_bd;
scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f);
ae_bd = a * e - b * d;
if (ae_bd == 0)//当ae_bd==0是的两种情况
{
if (c * e == b * f && a * f == c * d) //判断无数解的情况
{
printf("0 0");
}
else//判断无解的情况
{
printf("-1 -1");
}
}
else //判断有将诶
{
double x = (double)(c * e - b * f) / ae_bd;
double y = (double)(a * f - c * d) / ae_bd;
printf("%.2f %.2f", x, y);
}
return 0;
}