Loading

自然数性质-数根

数根

数根的定义

数根是自然数的一种性质,将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于十为止所得到的数,即为数根。换句话说,数根是将一数字重复做其数字之和,直到其值小于十为止,则所得的值为该数的数根。例如54817的数根为7,因为5+4+8+1+7=25,25大于10则再加一次,2+5=7,7小于十,则7为54817的数根。 ---百度百科

那么,其实用编程的方法来求数根的思路很简单,要么迭代,要么递归,但两者的时间复杂度不会有差别,反而后者会占用程序栈的空间。

数根的一般代码

直接上代码

//迭代法
int digitRoot(int n){
    while(n >= 10){
        int res = 0;
        while(n){
            int temp = n % 10;
            n /= 10;
            res += temp;
        }
        n = res;
    }
    return n;
}
//递归法
int digitRoot(int n){
    //base case
    if(n < 10)
        return n;
    int sum = 0;
    while(n){
        int temp = n % 10;
        n /= 10;
        sum += temp;
    }
    return digitRoot(sum);
}

数根的公式和性质

但是,数根其实是有公式的,可以直接让代码复杂度降到O(1)

int digitRoot(int n){
    return --n % 9 + 1;
}

接下来看看这个公式怎么得来的。

首先看看数根的性质

  • 任何数字加9,数根不变:假设一个两位数18,如果加9,就是让十位数加1,个位数减1,各个位的数字总和不变,即数根不变。

  • 任何数字乘9,数根都为9:其实把对象互换一下就能理解,9的数根肯定为9,让9乘任何数,就是让9不停地加9。根据上条性质可得,数根不变。即数根肯定为9。

数根的公式推导

假定一十进制数 XX0X1X2...Xn-1Xn

在进位制种表达式为

\[\sum_{i=0}^{n-1}{X_n}*10^i \]

由于

\[\because\quad 10^i = 1(mod\quad9) \]

\[1^i = 1(mod\quad9) \]

\[可以写成 \quad 10^i \equiv 1^i \equiv 1(mod\quad9) \]

可得,一个数和他各位数之和的模9同余

\[令\quad f(x) = \sum_{i=0}^{n-1}a_i \]

\[则\quad f(x) \equiv x(mod\quad 9) \]

\[则有\quad f(f(x)) \equiv f(x) = x(mod\quad 9) \]

\[\therefore\quad digitRoot(n) = \begin{cases}0\quad,n=0\\9\quad,n\neq0,n\equiv0(mod\quad9)\\n\quad mod9, n\not\equiv0(mod\quad 9) \end{cases} \]

\[\therefore\quad digitRoot(n) = (n-1) mod 9 + 1 \]

参考文章

"数根公式的推导"

posted @ 2021-11-25 23:36  骆驼弟弟  阅读(996)  评论(0)    收藏  举报