自然数性质-数根

数根

数根的定义#

数根是自然数的一种性质,将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于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

在进位制种表达式为

i=0n1Xn10i

由于

10i=1(mod9)

1i=1(mod9)

10i1i1(mod9)

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

f(x)=i=0n1ai

f(x)x(mod9)

f(f(x))f(x)=x(mod9)

digitRoot(n)={0,n=09,n0,n0(mod9)nmod9,n0(mod9)

digitRoot(n)=(n1)mod9+1

参考文章#

"数根公式的推导"

posted @   骆驼弟弟  阅读(798)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
主题色彩