|
kuing
Posted 2019-4-13 15:46
回复 7# kuing
搞清楚了,算多少个 0 的确有一点不同,就是补回个位时,由于要求正整数,当个位取 0,前面就不能取零,所以此时与 5# 的差别就是“(注意包括零)”得改成“(注意不包括零)”,而且也没有少补一个的情形,因此递推式就只有一条:
\[f(k+1)=10f(k)-(9-a_{k+1})g(k)+\overline{a_1a_2\cdots a_k},\]另外,此时 `f(1)=0` 是肯定的,可见 0 的个数是更简单的。
综上所述,将结论重新写一下:
设 `\{a_1,a_2,\ldots\}`(`a_1\ne0`)为给定的数码序列,设不超过 `\overline{a_1a_2\cdots a_k}` 的所有正整数一共出现数码 `m` 的个数为 `f(k,m)`,设 `\overline{a_1a_2\cdots a_k}` 自身含数码 `m` 的个数为 `g(k,m)`,则有
\[
f(k+1,m)=\led
&10f(k,m)-(9-a_{k+1})g(k,m)+\overline{a_1a_2\cdots a_k}+1, && a_{k+1}\geqslant m>0,\\
&10f(k,m)-(9-a_{k+1})g(k,m)+\overline{a_1a_2\cdots a_k}, && m=0\lor a_{k+1}<m.
\endled
\]
由此,就可以将楼上的程序改进一下,即:- m = 0;
- n = 271828;
- nlist = IntegerDigits[n];
- g[k_] := Count[Take[nlist, k], m];
- f[0] = 0;
- Do[f[k + 1] = 10 f[k] - (9 - nlist[[k + 1]]) g[k] + FromDigits[Take[nlist, k]] +
- If[m == 0 || nlist[[k + 1]] < m, 0, 1], {k, 0, Length[nlist] - 1}];
- f[Length[nlist]]
Copy the Code 这样 m 就能任取 0~9 了。
运行得到不超过 271828 的正整数一共出现 128462 个 0。 |
|