题意
给定两个整点的坐标,求它们所在直线的函数解析式(一次函数)。
输入格式
输入共两行。
第一行有两个整数 x 1 , y 1 x1,y1 x1,y1。表示第一个整点的坐标为 ( x 1 , y 1 ) (x1,y1) (x1,y1)。
第二行有两个整数 x 2 , y 2 x2,y2 x2,y2。表示第二个整点的坐标为 ( x 2 , y 2 ) (x2,y2) (x2,y2)。
输出格式
输出共一行,即这个函数解析式。
二乘X表示为2x
二分之一乘X表示为1/2*x
样例输入
3 -1
5 -2
样例输出
y=-1/2*x+1/2
分析
题意其实就是在让我们解方程
{ k x 1 + b = y 1 ( 1 ) k x 2 + b = y 2 ( 2 ) \begin{cases} kx_1 + b = y_1(1)\\ kx_2 + b = y_2 (2)\end{cases} {kx1+b=y1(1)kx2+b=y2(2)
(
2
)
−
(
1
)
(2) - (1)
(2)−(1),得
k
(
x
2
−
x
1
)
=
y
2
−
y
1
k(x_2 - x_1) = y_2 - y_1
k(x2−x1)=y2−y1
k
=
y
2
−
y
1
x
2
−
x
1
k = \dfrac{y_2 - y_1}{x_2 - x_1}
k=x2−x1y2−y1
将
k
=
y
2
−
y
1
x
2
−
x
1
k = \dfrac{y_2 - y_1}{x_2 - x_1}
k=x2−x1y2−y1 带入
(
2
)
(2)
(2),得
x
2
×
y
2
−
y
1
x
2
−
x
1
+
b
=
y
2
x_2 \times \dfrac{y_2 - y_1}{x_2 - x_1} + b = y_2
x2×x2−x1y2−y1+b=y2
b
=
y
2
−
x
2
×
y
2
−
y
1
x
2
−
x
1
b = y_2 - x_2 \times \dfrac{y_2 - y_1}{x_2 - x_1}
b=y2−x2×x2−x1y2−y1
b
=
y
2
−
x
2
(
y
2
−
y
1
)
x
2
−
x
1
b = y_2 - \dfrac{x_2(y_2 - y_1)}{x_2 - x_1}
b=y2−x2−x1x2(y2−y1)
b
=
y
2
(
x
2
−
x
1
)
−
x
2
(
y
2
−
y
1
)
x
2
−
x
1
b = \dfrac{y_2(x_2 - x_1) - x_2(y_2 - y_1)}{x_2 - x_1}
b=x2−x1y2(x2−x1)−x2(y2−y1)
b
=
y
2
x
2
−
y
2
x
1
−
x
2
y
2
+
x
2
y
1
x
2
−
x
1
b = \dfrac{y_2x_2 - y_2x_1 - x_2y_2 + x_2y_1}{x_2 - x_1}
b=x2−x1y2x2−y2x1−x2y2+x2y1
b
=
x
2
y
1
−
y
2
x
1
x
2
−
x
1
b = \dfrac{x_2y_1 - y_2x_1}{x_2 - x_1}
b=x2−x1x2y1−y2x1
因此原方程解为:
{
k
=
y
2
−
y
1
x
2
−
x
1
b
=
x
2
y
1
−
y
2
x
1
x
2
−
x
1
\begin{cases}k = \dfrac{y_2 - y_1}{x_2 - x_1}\\ b = \dfrac{x_2y_1 - y_2x_1}{x_2 - x_1}\end{cases}
⎩
⎨
⎧k=x2−x1y2−y1b=x2−x1x2y1−y2x1
我们只需要将两个式子约分后输出即可。
代码
#include<bits/stdc++.h>
//y1 可能会有玄学错误
#define y1 y_1
#define y2 y_2
using namespace std;
long long x1,x2,y1,y2,k_fz,k_fm,b_fz,b_fm;
void yuefen(long long &a,long long &b) {
long long c;
c = __gcd(a,b);
a /= c,b /= c,c = 1;
if(a < 0) c = -c,a = -a;
if(b < 0) c = -c,b = -b;
if(c < 0) a = -a;
return;
}
void find_k() {
k_fz = y2 - y1;
k_fm = x2 - x1;
yuefen(k_fz,k_fm);
}
void find_b() {
b_fz = y1 * x2 - y2 * x1;
b_fm = x2 - x1;
yuefen(b_fz,b_fm);
}
signed main() {
cin >> x1 >> y1 >> x2 >> y2;
find_k(),find_b();
cout<<"y=";
if(k_fm == 1 and k_fz == 1) cout<<"x";
else if(k_fm == 1) cout<<k_fz<<"x";
else cout<<k_fz<<"/"<<k_fm<<"*x";
if(b_fz != 0) {
if(b_fz > 0) cout<<"+";
if(b_fm == 1) cout<<b_fz;
else cout<<b_fz<<"/"<<b_fm;
}
return 0;
}