数根:数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于10的话,则继续将各位数进行横向相加直到其值小于10为止
考虑自然数
n
n
n,对于
b
b
b进制
(
b
>
1
)
(b>1)
(b>1),定义数字和
F
b
:
N
→
N
F_b:\mathbb{N}\to\mathbb{N}
Fb:N→N为
F
b
(
n
)
=
∑
i
=
0
k
−
1
d
i
F_b\left(n\right)=\sum_{i=0}^{k-1}d_i
Fb(n)=i=0∑k−1di
其中
k
=
⌊
log
b
n
⌋
+
1
k=\lfloor \log_b n\rfloor+1
k=⌊logbn⌋+1为
b
b
b进制下这个数字有多少位,
d
i
=
n
mod
b
i
+
1
−
n
mod
b
i
b
i
d_i=\frac{n \operatorname{mod} b^{i+1}-n\operatorname{mod} b^i}{b^i}
di=binmodbi+1−nmodbi
换句话说,
n
=
∑
i
=
0
k
−
1
d
i
b
i
n=\sum_{i=0}^{k-1}d_i b^i
n=∑i=0k−1dibi
如果 F b ( n ) = n F_b(n)=n Fb(n)=n,则 n n n是一个数根
如果
n
≥
b
n\ge b
n≥b,则
F
b
(
n
)
=
∑
i
=
0
k
−
1
d
i
<
∑
i
=
0
k
−
1
d
i
b
i
<
n
F_b(n)=\sum_{i=0}^{k-1}d_i<\sum_{i=0}^{k-1}d_i b^i<n
Fb(n)=i=0∑k−1di<i=0∑k−1dibi<n
也就是说求一次数字和会越来越小,直到
n
<
b
n<b
n<b
性质
注意到
b
k
mod
(
b
−
1
)
=
1
b^k\operatorname{mod} (b-1)=1
bkmod(b−1)=1
n
mod
(
b
−
1
)
=
(
∑
i
=
0
k
−
1
d
i
b
i
)
mod
(
b
−
1
)
=
(
∑
i
=
0
k
−
1
d
i
)
mod
(
b
−
1
)
n \operatorname{mod}(b-1)=\left(\sum_{i=0}^{k-1}d_i b^i\right) \operatorname{mod}(b-1)=\left(\sum_{i=0}^{k-1}d_i\right) \operatorname{mod}(b-1)
nmod(b−1)=(i=0∑k−1dibi)mod(b−1)=(i=0∑k−1di)mod(b−1)
所以求数字和等价于对
b
−
1
b-1
b−1取模
特殊情况就是
n
=
k
(
b
−
1
)
(
k
>
1
)
n=k(b-1)\ (k>1)
n=k(b−1) (k>1)
这种情况下
n
mod
(
b
−
1
)
=
b
−
1
+
(
k
−
1
)
(
b
−
1
)
mod
(
b
−
1
)
=
b
−
1
n \operatorname{mod}(b-1)=b-1+(k-1)(b-1)\operatorname{mod}(b-1)=b-1
nmod(b−1)=b−1+(k−1)(b−1)mod(b−1)=b−1
即数根为
b
−
1
b-1
b−1
综上所述,
b
b
b进制下
F
b
(
n
)
=
{
0
n
=
0
(
n
−
1
)
mod
(
b
−
1
)
n
≡
0
mod
(
b
−
1
)
n
mod
(
b
−
1
)
n
≢
0
mod
(
b
−
1
)
=
{
0
n
=
0
1
+
(
n
−
1
)
mod
(
b
−
1
)
n
>
0
F_b(n)=\begin{cases} 0&n=0\\ (n-1)\operatorname{mod}(b-1)& n\equiv0\operatorname{mod}(b-1)\\ n \operatorname{mod}(b-1)&n\not\equiv0\operatorname{mod}(b-1)\\ \end{cases}=\begin{cases} 0&n=0\\ 1+(n-1)\operatorname{mod}(b-1)& n>0 \end{cases}
Fb(n)=⎩
⎨
⎧0(n−1)mod(b−1)nmod(b−1)n=0n≡0mod(b−1)n≡0mod(b−1)={01+(n−1)mod(b−1)n=0n>0
在代码里是取余,所以可以不用分类讨论
https://leetcode.com/problems/add-digits/
这题是10进制,所以对9取余
class Solution {
public:
int addDigits(int num) {
return 1+(num-1)%9;
}
};