P2026 求一次函数解析式【题解】

小 模 拟 被 我 做 成 了 大 模 拟 题 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=x2x1dy=y2y1

那么斜率
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=y0dxdyx0

此时题目中要求的量我们都求出来了,现在只需注意以上的几点特判,处理最终的答案即可。

过程艰辛。

#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++库里自带的,也可以手写。

猜你喜欢

转载自blog.csdn.net/qq_62444770/article/details/120803903