这题做过的,1是最先用完的,所以统计1到稍大的一个数之间,哪个数正好用完2021个1
count = 0
ans = ''
for i in range(10000):
tmp = str(i)
count = count + tmp.count('1')
if count == 2021:
print(i)
break
if count>2021:
print(i-1)
break
for i in range(1,3182):
ans = ans + str(i)
print(ans.count('1'))
答案3181
暴力遍历所有的点,round(4)的目的是防止算截距时出现的差距,比如1.6666666667和1.666666668它认为是两个不同的截距。出现这种差距的原因主要是因为我算截距用了上面得到的斜率k。
两种计算截距方式:
(x2 * y1 - x1 * y2) / (x2 - x1)
0.5*(y1+y2) - 0.5*k*(x1+x2)
第一种更好,但是难以记忆。第二种简单但是会有误差。
X = []
Y = []
for i in range(20):
X.append(i)
for i in range(21):
Y.append(i)
ans=set()
def k(x1,x2,y1,y2):
if x1 == x2:
return
tmp = ((y1-y2)/(x1-x2))
b = 0.5*(y1+y2) - 0.5*tmp*(x1+x2)
b=round(b,4)
ans.add((tmp,b))
for i in range(20):
for j in range(21):
for x in range(20):
for y in range(21):
k(i,x,j,y)
print(len(ans)+20)
答案:40257
思路:先求因数,然后在因数集合中三次遍历。
为什么因子是两个两个获取,而最终三次遍历得到结果呢,这是我一开始遇到的疑惑。
以2*3*4 = 24为例。
我先获得24的所有因子,1,2,3,4,6,8,12,24。
你会发现对于一个数n,它的双因子集合为A。那么数n的三因子集合B是A的子集。
n = 2021041820210418
fac = []
for i in range(1,int(n**0.5)+1):
if n%i == 0:
#print(i)
fac.append(i)
fac.append(n//i)
ans = set()
for i in fac:
for j in fac:
for x in fac:
if i*j*x == n:
ans.add((i,j,x))
print(ans)
print(len(ans))
答案:2430