自然数性质-数根
数根
数根的定义
数根是自然数的一种性质,将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于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。
数根的公式推导
假定一十进制数 X为X0X1X2...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
\]

浙公网安备 33010602011771号