时间:2016-03-16 15:33:39

标签: algorithm math largenumber

摘要

在这种情况下,增加号码的数字会随着从左向右移动而增加,例如145783489 3347778

递减数字将相同,但反转除外,例如84320931

给定1到10之间的数字x,如果不使用强力/迭代类型的方法,您如何计算增加但不减少或减少但不增加的数字总数?

x

的前几个值的示例图表
+---+-------+
| X | Total |
+---+-------+
| 0 |     1 |
| 1 |    10 |
| 2 |   100 |
| 3 |   475 |
| 4 |  1675 |
| 5 |  4954 |
+---+-------+

1 个答案:

答案 0 :(得分:5)

如果要计算增加的​​数量,可以构建一个2D表,其中行对应于所涉及的数字,列对应于数字位数。然后使用单元格中最多i的数字插入带j位数的递增数字。第一栏很简单:

      1 digit  2 digits  3 digits ...
>= 0     10
>= 1     9
>= 2     8
>= 3     7
>= 4     6
>= 5     5
>= 6     4
>= 7     3
>= 8     2
>= 9     1

如果要计算下一列,可以参考前一列。假设您要计算cell(2, 9)(数字大于9的两位数字)。然后你可以在前面放一个9并使用任何一位数大于9的数字。所以,只有1. cell(2, 8)也是如此。您可以在前面添加8加上任何1位数字,数字大于8(cell(1, 8))加上您用于下面单元格的相同数字。一般来说:

cell(i, j) = cell(i - 1, j) + cell(i, j + 1)

前几列是:

      1 digit  2 digits  3 digits ...
>= 0     10    10+45=55   55+165=220
>= 1     9     9+36=45    45+120=165
>= 2     8     8+28=36    36+84=120
>= 3     7     7+21=28    28+56=84
>= 4     6     6+15=21    21+35=56
>= 5     5     5+10=15    15+20=35
>= 6     4     4+ 6=10    10+10=20
>= 7     3     3+ 2=6      6+ 4=10
>= 8     2     2+ 1=3      3+ 1=4
>= 9     1          1           1

总数始终是条目cell(digits, 0)。所以有220个增加的数字,有三个或更少的数字。

可以计算类似的表以减少数字。但是,为了计算递减数的数量,您必须对所有列求和。例如。对于三位数递减的数字:10+55+220=285

为了计算增加或减少的数字,只需将这两个值相加并减去增加和减少的数字。对于每个数字,它将有10.因此,对于3位数字,您必须计算220+285-30=475

因此,迭代计算表格。您只需要保留当前列并相应地计算总数。