数根(digital root)

数根:数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于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:NN
F b ( n ) = ∑ i = 0 k − 1 d i F_b\left(n\right)=\sum_{i=0}^{k-1}d_i Fb(n)=i=0k1di
其中 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+1nmodbi
换句话说, n = ∑ i = 0 k − 1 d i b i n=\sum_{i=0}^{k-1}d_i b^i n=i=0k1dibi

如果 F b ( n ) = n F_b(n)=n Fb(n)=n,则 n n n是一个数根

如果 n ≥ b n\ge b nb,则
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=0k1di<i=0k1dibi<n
也就是说求一次数字和会越来越小,直到 n < b n<b n<b

性质

注意到 b k mod ⁡ ( b − 1 ) = 1 b^k\operatorname{mod} (b-1)=1 bkmod(b1)=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(b1)=(i=0k1dibi)mod(b1)=(i=0k1di)mod(b1)
所以求数字和等价于对 b − 1 b-1 b1取模

特殊情况就是 n = k ( b − 1 )   ( k > 1 ) n=k(b-1)\ (k>1) n=k(b1) (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(b1)=b1+(k1)(b1)mod(b1)=b1
即数根为 b − 1 b-1 b1
综上所述, 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(n1)mod(b1)nmod(b1)n=0n0mod(b1)n0mod(b1)={01+(n1)mod(b1)n=0n>0

在代码里是取余,所以可以不用分类讨论

https://leetcode.com/problems/add-digits/
这题是10进制,所以对9取余

class Solution {
public:
    int addDigits(int num) {
        return 1+(num-1)%9;
    }
};

参考:
https://en.wikipedia.org/wiki/Digital_root

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nightmare004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值