【发布时间】:2017-11-13 16:53:35
【问题描述】:
让我们有 3 位数字 (100-999)。至少有多少位数字为“2”的数字?
如何为此制定算法?还是数学函数?
【问题讨论】:
标签: algorithm math combinations
让我们有 3 位数字 (100-999)。至少有多少位数字为“2”的数字?
如何为此制定算法?还是数学函数?
【问题讨论】:
标签: algorithm math combinations
包含-排除原则
有多少个 3 位数字以 2 作为第一位数字 (2xx)?没错-100。而作为第二个数字(x2x)? 100!而作为第三个 (xx2) - 相同的数字。好的,现在我们有了 300 数字,但是我们忘记了 22x 形式的数字,我们计算了两次。现在我们需要减去22x、2x2 和x22 的数量。现在我们有270,但是我们忘记了数字222,我们加了3次,减了3次,我们需要再次添加:271。这个解释是inclusion-exclusion principle的一个例子。
但这还没有结束,我们需要减去所有以2 为数字的0xx 数字。类似的方法:271 - 10 - 10 + 1 = 252。
动态编程
好的,如果你不喜欢前面的方法,还有另一种方法。让我们计算函数F(i, has2),其中i - 是数字的位数长度,has2 布尔值,如果位数包含2,则等于true,否则等于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
【讨论】:
python 的一个快速的'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/ 进行测试。
【讨论】:
range(a,b)lazy 枚举所有数字,str(x) 从每个数字中生成一个字符串,'in' 检查字符串内的 ''2'',所有这些都会产生您想要的结果。 - 正如我在问题中评论的那样,这是一种蛮力方法。全部检查并整理出来。