小
模
拟
被
我
做
成
了
大
模
拟
题
a
w
a
。
{\color{green}{小模拟被我做成了大模拟题awa。}}
小模拟被我做成了大模拟题awa。
题意解析:
给出平面上两个定点
(
x
1
,
y
1
)
(x_1,y_1)
(x1?,y1?)和
(
x
2
,
y
2
)
(x_2,y_2)
(x2?,y2?),求出过这两个点的一次函数的解析式。
解题思路:
首先明确题目类型,这是一道模拟题,柯我最不擅长模拟题了。
再看数据范围,大概均在整型范围内,但这题最坑的点不是毒瘤数据,而是各种特判:
1.
由
于
是
一
次
函
数
,
不
需
要
考
虑
斜
率
不
存
在
的
情
况
。
1. 由于是一次函数,不需要考虑斜率不存在的情况。
1.由于是一次函数,不需要考虑斜率不存在的情况。
2.
样
例
由
分
数
给
出
,
所
以
我
们
要
时
刻
保
持
分
子
和
分
母
的
互
质
(
g
c
d
)
2.样例由分数给出,所以我们要时刻保持分子和分母的互质(gcd)
2.样例由分数给出,所以我们要时刻保持分子和分母的互质(gcd)
3.
求
最
大
公
约
数
的
时
候
要
化
成
正
数
,
运
算
时
要
化
回
来
。
3.求最大公约数的时候要化成正数,运算时要化回来。
3.求最大公约数的时候要化成正数,运算时要化回来。
4.
b
=
0
时
不
需
输
出
。
4.b=0时不需输出。
4.b=0时不需输出。
5.
整
数
后
面
跟
字
母
无
乘
号
,
分
数
后
面
有
。
5.整数后面跟字母无乘号,分数后面有。
5.整数后面跟字母无乘号,分数后面有。
考虑了以上几种情况,我们就可以考虑具体的代码实现了。根据高中解析几何相关知识,我们定义
{
d
x
=
x
2
?
x
1
d
y
=
y
2
?
y
1
\begin{cases} dx=x_2-x_1\\ dy=y_2-y_1 \end{cases}
{dx=x2??x1?dy=y2??y1??
那么斜率
k
=
d
y
d
x
k=\frac{dy}{dx}
k=dxdy?
题目要输出斜截式,我们在算出斜率的情况下,根据
y
0
=
k
x
0
+
b
y_0=kx_0+b
y0?=kx0?+b 移项得
b
=
y
0
?
d
y
x
0
d
x
b=y_0-\frac{dyx_0}{dx}
b=y0??dxdyx0??
此时题目中要求的量我们都求出来了,现在只需注意以上的几点特判,处理最终的答案即可。
过程艰辛。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x1,y1,x2,y2,flag=0;
cin>>x1>>y1>>x2>>y2;
int dy=y1-y2,dx=x1-x2;
int devide=__gcd(abs(dx),abs(dy));dy/=devide;dx/=devide;
cout<<"y=";
if(dy*dx<0)
{
flag=1;
cout<<"-";
}
if(dy%dx==0) cout<<(abs(dy/dx));
else cout<<abs(dy)<<"/"<<abs(dx)<<"*";
cout<<"x";
int a=dx*y1-dy*x1,b=dx;
if(a==0)
{
cout<<endl;
return 0;
}
if(a*b<0) cout<<"-";
else cout<<"+";
devide=__gcd(abs(a),abs(b));a/=devide;b/=devide;
if(a%b==0) cout<<abs(a/b);
else cout<<abs(a)<<"/"<<abs(b);
cout<<endl;
return 0;
}
这里的欧几里得函数为C++库里自带的,也可以手写。
|