Kick Start 2018 - Round B
1. No Nine
Q: 求 [L, R] 的合法数字个数,合法数字是不能包含9也不能被9整除。L和R一定合法。
A:
- 自己的想法:区间内多少含有9的数字,多少9的倍数,多少又包含9又是9的倍数,分别计算出来。区间内如果不好求,就写一个函数,是[1,x]内的数字个数,然后[1,R]-[1,L]
- 官解:先把问题变成子问题,即上述的,把问题换成[1,N],则
res = count(R)-count(L)+1 # 因为L肯定是合法数字
count函数:(没有很看懂)
def count(N):
res = 0
L = len(str(N)
for i,v in enumerate(str(N):
if i < L - 1:
# int(v)是该位值,后面每位都有0-8共9个数字进行选择,除了最后一位。最后一位9个数字是连续的,必有一个数字可以被9整除,是不合法的。
res += int(v) * (9 ** (L - 2 - i)) * 8
else:
for i in range(N - N % 10, N + 1): # 最后一位
if i % 9 > 0:
res += 1
# 或者上面三行等同于下面一行
# res += N % 10 + (N % 9 > N % 10)
return res
- DFS或DP