刷题记录-2021年第12届蓝桥杯竞赛-直线

在这里插入图片描述

 主要就是找不同的直线,直线最先想到斜率,但是仅仅凭借斜率是不能确定一条直线,所以还需要截距

y=kx+b

来确定一条直线

 代码:

#include<bits/stdc++.h>
using namespace std;
set<pair<double, double> > zx;// 直线的k和b 
int main()
{	
	 for(double x1=0;x1<20;x1++)
    {
        for(double y1=0;y1<21;y1++)
        {
            for(double x2=0;x2<20;x2++)
            {
                for(double y2=0;y2<21;y2++)
                if(x1!=x2)//避免斜率不存在的情况
                {
                    double k=(double)(y2-y1)/(x2-x1); //斜率 
                    // double b=y2-k*x2;
                    double b=(double)(y1*x2-y2*x1)/(x2-x1);//截距 
                    zx.insert({k, b});
                }
            }
        }
    }   
	cout<<zx.size()+20;

	return 0;
}

注意:因C++无控制double变量小数位数的函数,所以要注意截距b在计算时不可直接用上述算出的k来直接带入计算,因为double本身取值会造成误差,带入计算则会造成二次误差,影响结果。在这里对b的计算进行化简合并:b = y - k*x = y1 - \frac{\Delta y}{\Delta x} * x1 = \frac{y1*(x2-x1)}{x2-x1} - \frac{x1*(y2-y1)}{x2-x1} = \frac{y1x2-y2x1}{x2-x1}

crazy

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值