一种算法,用于查找给定限制“1”(0 <= 1 <= 10 ^ 16)中的数字的数量,其中至少出现一个数字数字'n'?

时间:2013-07-23 05:51:03

标签: algorithm numbers combinatorics

首先,这不是一个功课问题。我正在经历一些组合问题以通过算法解决,我真的只需要开始解决这个问题。

我最初的想法是声明一个大小为17的数组初始化它并运行一个循环来查找数字的出现,比如使用简单的搜索来说“5”。但解决方案看起来很乏味和丑陋。

  1. 关于如何代表一个大数字(10 ^ 16)的任何想法?
  2. 是否有一个简单的组合公式/算法来解决这类问题?
  3. 感谢。

2 个答案:

答案 0 :(得分:1)

假设你的意思是0&lt; = l&lt; 10 ^ 16(不是&lt; = 10 ^ 16),此范围内的所有整数都有10位数(允许前导0)。在此范围内总共有10 ^ 16个值。我把问题写成:

数字 n 的数字= 10 ^ 16 - 数字 n

那么我们有多少种方法可以在1的地方选择 n ? 9种方式。我们有多少种方式可以放置一个&#39; n&#39;在10s或1的地方? 9 * 9。遵循这个逻辑,有9 ^ 16种方法不将 n 放入16个可能的插槽中。

所以你的答案是10 ^ 16 - 9 ^ 16。

如果你实际上意味着0&lt; = l&lt; = 16,那么该范围只有一个数字,即10 ^ 16。此数字的前导数字为1,因此如果 n = 1,则恰好有10 ^ 16 - 9 ^ 16 + 1个值,其中包含1。如果n!= 1,则前一个答案成立。

答案 1 :(得分:0)

让:

  

G(m)是值i的数量,其中0<=i<=10^m包含数字n!=0

正如之前的回答所说,当n!=0时,答案是:

  

G(m) = 10^m - 9^m

所以,G(16) = 10,000,000,000,000,000 - 1,853,020,188,851,841 = 8,126,979,811,148,159

n=0时,有两种方法可以查看它。

1)仅计算第一个非零数字后的数字   2)计算所有m个数字,即使该数字以许多0个数字开头

对于第二种情况,则n=0n!=0时的答案相同。

  

F(m)是值i的数量,其中0<=i<=10^m包含数字n=0

对于第一种情况,答案稍微复杂一点。在m位数字中,第一个数字不是0,但剩余的m-1数字可以是任何数字。因此,G(m-1) F(m)= 9 * G(m-1)`定义的数字m-1' digits can contain a zero. Since there are 9 (non zero) possibilities for the leading digit,

  

H(m,n)为值i的数量,其中0<=i<=10^m包含数字n

然后:

  

H(m,n) = G(m)如果n!=09*G(m-1) n=0

,其中

  

G(m) = 10^m - 9^m

因此,H(16,n) = 8,126,979,811,148,159如果n!=0H(16,0) = 7,146,979,811,148,159