让我们有3位数字(100-999)。有多少这样的数字,至少有一个数字" 2"存在?
如何制作算法?还是数学函数?
答案 0 :(得分:6)
包含 - 排除原则
有多少个3位数的数字2
作为第一个数字(2xx
)?那是对的 - 100
。并作为第二个数字(x2x
)? 100
!而作为第三个(xx2
) - 相同的数字。好的,现在我们有300
个数字,但我们忘记了22x
形式的数字,我们算了两次。现在我们需要减去22x
,2x2
和x22
数字的数量。现在我们有270
个,但我们忘记了号码222
,我们添加了三次,减去了三次,我们需要再次添加:271
。此解释是inclusion-exclusion principle的一个示例。
但这不是结束,我们需要将0xx
个数字2
减去数字。类似方法:271 - 10 - 10 + 1 = 252
。
动态编程
好的,如果你不喜欢以前的方法,还有另一种方法。让我们计算函数F(i, has2)
,其中i
- 是数字的数字长度,has2
布尔值,如果数字包含true
则等于2
,否则它等于false
。重现关系如下:
F(1, false) = 8, F(1, true) = 1
F(i, true) = F(i-1, true) * 10 + F(i-1, false)
F(i, false) = F(i-1, false) * 9
答案是F(3, true)
。
F(2, true) = 10 + 8 = 18
F(2, false) = 8 * 9 = 72
F(3, true) = 18 * 10 + 72 = 252
答案 1 :(得分:1)
使用python的quick'n'dirty是:
n = [x for x in range(100,999) if '2' in str(x)]
print("There are " + str(len(n)) + " numbers between 100 and 999 containing at least one '2'")
print(n)
将其放入https://pyfiddle.io/进行测试。