2021年蓝桥杯python组真题-直线(细节+分析+代码)
题目 :

代码:
#直线
M=[[x,y] for x in range(20) for y in range(21)] #创建二维列表:代表xy坐标系
d=set() #创建集合属性的容器:因为集合里的元素不会重复
for i in M: #二重循环遍历每个坐标
x1,y1=i[0],i[1] #注意书写格式:a,b=c,d
for j in M:
x2,y2=j[0],j[1]
if x1==x2: #特殊情况:直线垂直时斜率不存在,先跳过最后计算
continue
k=(y2-y1)/(x2-x1) #斜率公式
b=(x2*y1-x1*y2)/(x2-x1) #截距公式
if (k,b) not in d: #存入容器里没有的(斜率,截距)对
d.add((k,b))
print(len(d)+20) #输出结果:容器的长度40237+斜率不存在的20种情况=40257
坑点:
这道题我开始做的时候把截距公式换成了:b = y1 - kx1
这个时候我会发现答案会多出很多,最后通过输出截距,才发现原来是精读问题!
分析:如果k求出来是一个无限循环小数(python输出的时候会四舍五入),而y1是整数,y1和k*x1相减的话,得到的值并不是真正的b,因为k在计算的时候被四舍五入过,会有极其细微的误差,但又非常影响结果!因为我们求到的直线方程要放进set集合里判重,如果b一个是1.000001一个是1.000000,其实是一个直线方程,但是因为计算的误差,我们误以为是两个直线方程,所以就会导致答案多出很多!
精度损失参考:
对于浮点运算通常是很危险的!
主要的危险就是:精度损失
精度损失的含义是,对于double通常存在对末尾的四舍五入。比如在1/10(十进制是0.1)但是在二进制存储却是:0.00011001100110011001100110011001100110011001100110011001 10011…
所以在进行0.1+1.1会出现:1.20000000000000018这样奇怪的答案。
这种答案是致命的,因为这种答案会导致进入set<>集合的时候。1.2000000000018和1.2被当成两个数字对待。但实际上,1.2000000…完全是精度的问题。所以我们称之位“精度损失”。
(参考文献:https://www.zhihu.com/question/42024389)
避免坑点:
我们在求截距的时候,可以用分数的形式表示小数。

细节:
y = k x + b 对于k值我们知道,k delta y delta x,如果delta x = 0就是斜率不存在。在坐标轴上就是直线垂直于x轴的情况,根据题目中的数据,斜率不存在有20种情况,但我们遇到delta x = 0的时候就先跳过,然后在最后的答案上加20种情况就是答案。
2021年蓝桥杯python组真题-直线(细节+分析+代码)的更多相关文章
- 第七届蓝桥杯javaB组真题解析-分小组(第四题)
题目 /* 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF G ...
- 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)
题目 /* 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有 ...
- 第七届蓝桥杯javaB组真题解析-四平方和(第八题)
题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...
- 第七届蓝桥杯javaB组真题解析-剪邮票(第七题)
题目 /* 剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色 ...
- 第七届蓝桥杯javaB组真题解析-方格填数(第六题)
题目 /* 方格填数 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显 ...
- 第七届蓝桥杯javaB组真题解析-凑算式(第三题)
题目 /* 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比 ...
- 第七届蓝桥杯javaB组真题解析-生日蜡烛(第二题)
题目 /* 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...
- 第七届蓝桥杯javaB组真题解析-抽签(第五题)
题目 /* 抽签 X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. .... 那么最终派往W星的观察团会有多少种国别的不同组合 ...
- Python解答蓝桥杯省赛真题之从入门到真题(二刷题目一直更新)
蓝桥刷题 原文链接: https://github.com/libo-sober/LanQiaoCup Python解答蓝桥杯省赛真题之从入门到真题 不同字串 """ 一 ...
- 第四届蓝桥杯 c/c++真题
第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们 ...
随机推荐
- 访问gitGub速度慢的解决
转自: https://baijiahao.baidu.com/s?id=1608100091125662190&wfr=spider&for=pc GitHub是一个面向开源及私有软 ...
- Pytorch Cross Entropy
Entropy Uncetainly measure of surprise higher entropy = less info \[Entropy = -\sum_i P(i)\log P(i) ...
- CH573 CH582 CH579蓝牙从机(peripheral)例程讲解四(蓝牙动态广播)
动态广播有两种实现方式: 1.关闭广播,更改广播包数据,等待关闭上报状态后,开启广播. uint8_t initial_advertising_enable = FALSE; GAPRole_SetP ...
- python tkinter Checkbutton的新增和清除 取值
from tkinter import * root = Tk() name = StringVar() check_box_list = [] ent=Entry(root,textvariable ...
- mitmproxy截取流量和抓包
mitmproxy介绍https://blog.csdn.net/enemy_sprites/article/details/104052506 mitmproxy处理请求及乱码https://blo ...
- mysql 以自增id等于某个random()函数算出的值为条件查出两条数据
SELECT id FROM users WHERE id = FLOOR( rand() * ( (SELECT max(id) FROM users) - (SELECT min(id) FROM ...
- Matlab - 在Figure界面去掉图像的坐标刻度
Matlab版本:2018b 经过一番尝试,发现有两种方法 第一种:修改坐标轴的Visible属性,去掉坐标轴数字和坐标轴标签 第二种:删除Tick,只去掉坐标轴数字 第一种 ①原图 ②如果有多个子图 ...
- GameObject.Find()、Transform.Find()查找游戏对象
GameObject.Find 按广度进行查找 GameObject.Find("GameObject"); GameObject.Find("GameObject/Ch ...
- JDK 7 HashMap 并发情况下的死锁问题
目录 问题描述 详细解释 问题描述 JDK7的 HashMap 解决冲突用的是链表,在插入链表的时候用的是头插法,每次在链表的头部插入新元素.resize() 的时候用的依然是头插,头插的话,如果某个 ...
- Jx9嵌入式脚本语言基本用法
Jx9是一种嵌入式脚本语言,可用于编写嵌入式脚本和扩展. 以下是一些使用Jx9的示例: 1. 计算器 Jx9可以轻松实现一个计算器.例如: ```print("Enter two numbe ...