🥛宁好,我是柠檬斐林,欢迎一起交流
🥛 前头
最近刷蓝桥杯模拟题时刷到一道感觉可以更简单易懂的题,虽然大佬不是这样做的,
再次觉得暴搜的妙处(当然暴搜也是有技巧的,否则超时🤣)
🥛题目
如果一个整数 g 能同时整除整数 A 和 B,则称 g 是 A 和 B 的公约数。例如:43 是 86 和 2021 的公约数。
请问在 1(含) 到 2021(含) 中,有多少个数与 2021 存在大于 1 的公约数。
请注意 2021 和 2021 有大于 1 的公约数,因此在计算的时候要算一个。
🥛思路如下
写完后再看别人的觉得自己的还好理解一点(其实是更简单粗暴😁((供参考😬)),
简而言之,就是两个循环加一个if语句,当然还要设置一个不重复集合set,
只有两个for,不用太担心超时,为了保险起见(继续简化)
🥛原写法
某国奖学长已经整理好,(给出最大公约数的迭代和递归写法(分别用函数表示)),
然后再用枚举列出加一循环即可。
🥛代码
sun=0
a=set()
b=set()
for i in range(1,2022):
for j in range(2,i+1): #i+1也可以设置为2021,为了减少内存使用故用i+1
if 2021%j==0 and i%j==0:
sun+=1
a.add(i) #所求个数
b.add(j) #所有公约数
#print(sun)
print(len(a))
🥛评测结果与检验
答案:89
为了使结果更加确信,进行如下检验:
import numpy as np
a=list(a)
c=np.array(a)
#print(b)
#发现只有三个公约数:43、47、2021
print(c%43)
print(c%47)#有时间的话可以写个函数使集合里的约数全为0
如下: