在这种情况下,增加号码的数字会随着从左向右移动而增加,例如14578
和3489
和 3347778
。
递减数字将相同,但反转除外,例如84320
和931
。
给定1到10之间的数字x
,如果不使用强力/迭代类型的方法,您如何计算增加但不减少或减少但不增加的数字总数?
+---+-------+
| X | Total |
+---+-------+
| 0 | 1 |
| 1 | 10 |
| 2 | 100 |
| 3 | 475 |
| 4 | 1675 |
| 5 | 4954 |
+---+-------+
答案 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
。
因此,迭代计算表格。您只需要保留当前列并相应地计算总数。