2021python组B题

在这里插入图片描述
思路:通过确定不同的点之间确定的斜率与截距,将其放入集合中,利用集合的特征(唯一性)对重复的直线进行筛选。我们先将垂直于x轴的直线(斜率不存在的直线)排除在外,再统计其余的直线。

#穷举法
import time
start = time.time()
# 确定点列表。平面上20X21个整点{(x,y)|0≤x<20,0≤y<21,x∈Z,y∈Z}
ptslist = [(x,y) for x in range(20) for y in range(21)]

kdset = set()	# 构建一个集合用于存储斜率和截距
# print(type(kdset))

for cor1 in ptslist:
    for cor2 in ptslist:
        # print(cor1,cor2)
        if cor1[0] != cor2[0]:	# 将斜率不存在的直线排除在外
            k = (cor2[1]-cor1[1])/(cor2[0]-cor1[0]) #计算斜率
            d = cor2[1]-k*cor2[0] #计算截距
            kdset.add((round(k,10),round(d,10)))#这里有一个小问题,如果我们不将其保留一定的小数位的话,我们所得到的结果与答案不符。
            #保留10位小数,越精确重复的概率越小。

print(len(kdset)+20) #加20代表,垂直于x轴的直线,0-19一共20条直线
#结果为:40257
end = time.time()
print(end - start) #0.3580777645111084

关键点:round函数的使用。round(参数,保留的小数位),

print(round(3.5455,2))#2代表保留2位小数位
结果为:3.55
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值