【问题标题】:How many numbers are there that include a given digit?包含给定数字的数字有多少?
【发布时间】:2017-11-13 16:53:35
【问题描述】:

让我们有 3 位数字 (100-999)。至少有多少位数字为“2”的数字?

如何为此制定算法?还是数学函数?

【问题讨论】:

    标签: algorithm math combinations


    【解决方案1】:

    包含-排除原则

    有多少个 3 位数字以 2 作为第一位数字 (2xx)?没错-100。而作为第二个数字(x2x)? 100!而作为第三个 (xx2) - 相同的数字。好的,现在我们有了 300 数字,但是我们忘记了 22x 形式的数字,我们计算了两次。现在我们需要减去22x2x2x22 的数量。现在我们有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      
    

    【讨论】:

    • 是的,这个方法我也用过,但它的工作有点漫长而艰苦,数学上不正确,编程上也不可能
    • 这也是我的 pyhthon 给我的结果 :) 编写解决方案所需的精力比你投入的要少。程序员很懒 ;o) +1
    • @D3admau5 在一般情况下,第一种方法可以非常简单地使用二项式系数进行编程
    【解决方案2】:

    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/ 进行测试。

    【讨论】:

    • 谢谢,我总是在使用之前检查并尝试理解代码。我不是copypaster :) 顺便说一句,这在编程语言中看起来很容易,但我仍然找不到在数学上这么简单的方法。
    • @D3admau5 此答案中的 Python 代码是 brute force 解决方案的示例。每当问题是,“有多少……?”蛮力方法是全部生成并计算它们。这可能是回答某些问题的最快方法,但对于其他问题...需要找到解析解。
    • @D3admau5 它的代码很简单,因为主要工作(思考和优化)是由其他人花费在构建语言的部分上。 range(a,b)lazy 枚举所有数字,str(x) 从每个数字中生成一个字符串,'in' 检查字符串内的 ''2'',所有这些都会产生您想要的结果。 - 正如我在问题中评论的那样,这是一种蛮力方法。全部检查并整理出来。
    猜你喜欢
    • 2014-11-07
    • 2023-01-24
    • 2022-06-28
    • 2011-09-20
    • 2021-12-15
    • 2013-08-11
    • 2020-07-04
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多