背景

在LeetCode上遇到这道题:Add Digits

大意是给一个数,把它各位数字相加得到一个数,如果这个数小于10就返回,不然继续 addDigits(这个相加得到的数)。

题目很简单,但是如果要用 O(1) 时间复杂度,不要涉及循环或递归来解答的话,我就不知道如何下手了。

于是我找了一下别人的解法,发现涉及到一个 Digital Root 的原理(由于维基百科打不开,所以我觉得有必要记录一下我搜集到的信息和理解)。

Digital Root

我是从这个网站上看到它的推导过程,但是为了防止以后这些引用的网站不存在或者访问不了,还是得自立更生写一下。

首先,A ≡ B mod C, ≡ 这个符号, 表示 A mod C 和 B mod C 得到的结果一样。(即 同余

由于一个数的 digital sum 等于它所有位上的数加起来,即:

因为 10≡1i≡ 1 ( mod 9 ),所以:

推论出:一个数与它 各个位数和 的模9 同余。

从这个推论我们可以推导出:

f(f(x)) ≡ f(x) ≡ x (mod 9) (x=0 或 9 或 9的倍数 的情况除外)

为了同时兼顾 x=0 和 x=9 的情况,最后推导出来的公式是:

digital root = 1+ ((x-1) mod 9) 

(ps: 这么麻烦主要是为了兼顾 值为9的倍数 的数字)

(ps: 在计算机计算中,负数的模百家争鸣,所以最好把 0 的计算独立出来,免得为了 -1 % 9 伤脑筋)

延伸

同理可得,其他进制(非十进制)的数字的 digital root 也可以利用 同余 的原理推导出来,只不过 模的基数 以及 例外的情况 变了一下,例如如果计算八进制数字的 digital root,模的基数要取 7 而非 9,十六进制 则模的基数 为 15……

结论

1. digital root = 1+ ((x-1) mod 9)

2. 模运算真的能简化大数,好好利用可以省很多事。有空好好研究一下它的其他简化大数的功能。

Digital Root 的推导的更多相关文章

  1. codeforces 10C Digital Root(非原创)

    Not long ago Billy came across such a problem, where there were given three natural numbers A, B and ...

  2. Digital root(数根)

    关于digital root可以参考维基百科,这里给出基本定义和性质. 一.定义 数字根(Digital Root)就是把一个数的各位数字相加,再将所得数的各位数字相加,直到所得数为一位数字为止.而这 ...

  3. 数字根(digital root)

    来源:LeetCode 258  Add Dights Question:Given a non-negative integer  num , repeatedly add all its digi ...

  4. 【HDOJ】4351 Digital root

    digital root = n==0 ? 0 : n%9==0 ? 9:n%9;可以简单证明一下n = a0*n^0 + a1*n^1 + ... + ak * n^kn%9 = a0+a1+..+ ...

  5. Sum of Digits / Digital Root

    Sum of Digits / Digital Root In this kata, you must create a digital root function. A digital root i ...

  6. digital root问题

    问题阐述会是这样的: Given a non-negative integer num, repeatedly add all its digits until the result has only ...

  7. 1. 数字根(Digital Root)

    数字根(Digital Root)就是把一个自然数的各位数字相加,再将所得数的各位数字相加,直到所得数为一位数字为止.而这个一位数便是原来数字的数字根.例如: 198的数字根为9(1+9+8=18,1 ...

  8. 快速切题 sgu118. Digital Root 秦九韶公式

    118. Digital Root time limit per test: 0.25 sec. memory limit per test: 4096 KB Let f(n) be a sum of ...

  9. Codeforces Beta Round #10 C. Digital Root 数学

    C. Digital Root 题目连接: http://www.codeforces.com/contest/10/problem/C Description Not long ago Billy ...

随机推荐

  1. pjhp实现使用redis来存储session数据

    #设置php处理session的方式为redis,并配置redis的访问地址(因为在redis中绑定的访问地址为127.0.0.1,所以就没有设置访问密码,如果需要请自行搜索)#因为不想修改php.i ...

  2. linux性能分析工具Cpu

  3. C#基础知识之类和结构

    虽然项目中一直在使用类.结构体等类型,仔细琢磨,还真无法系统的说出个所以然.记录一下类.结构体.类和结构体区别 一.类 对于类,大家都特别熟悉.简单的介绍一下类的结构,然后记录一下Class需要注意的 ...

  4. condition简单示例

    在concurrent包中提供了condition接口,通过该接口可唤醒指定的某个线程,而不是采用随机唤醒的形式. import java.util.concurrent.locks.Conditio ...

  5. BigDecimal 算数

    BigDecimal big=new BigDecimal("22.233"); BigDecimal big1=new BigDecimal("12.233" ...

  6. python基础:2.二进制

    1.二进制:计算机存储0,1的一种方式,规则是逢2进1. 一个数字在计算机存储的是一个字节,即8个bit,每个bit要么存储0,要么存储1. 0000 0000 (二进制)表示 0(十进制), 000 ...

  7. pspice介绍1(转载)

    PSpice的主要功能及特点: OrCAD软件的主要组成包括:OrCAD/Capture CIS.OrCAD/Layout Plus.OrCAD/Express及OrCAD/PSpice.它们分别是: ...

  8. Fiddler的详细介绍

    Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要 ...

  9. checked属性 详解

    注意:当元素中有checked属性时,其值无论是什么,都是被选中状态,那怎么才能让其不被选中呢,就是用jquery或js代码实现 1.html中的checked属性.仔细研究下会发现一个很怪异的现象. ...

  10. head、tail 命令和实时(real-time)更新

    head.tail 命令和实时(real-time)更新 head filename: 输出 filename 文件的前10项 tail filename: 输出 filename 文件的后10项 即 ...