/ 写在前面 – 我热爱技术、热爱开源。我也相信开源能使技术变得更好、共享能使知识传播得更远。但是开源并不意味着某些商业机构/个人可以为了自身的利益而一味地索取,甚至直接剽窃大家曾为之辛勤付出的知识成果,所以本文未经允许,不得转载,谢谢/


    今天在知乎上看到了一个话题「大家都见过哪些让你虎躯一震的代码? - 知乎」,里面有一个「帖子」突然让我感受到了数学优化对我的降维打击

    不知道数根的朋友别急,听我娓娓道来,其实很简单。

    你比方说一个数 12 ,我们将它们的每一位拆开,然后相加,就得到 1+2=3 ,那么 3 就是 12 的数根。

    那么有同学就会问了(其实就是我自己),如果每位加起来得到的结果不是个位数呢?比方说 12345 ,我们得到 1+2+3+4+5=15 ,那么我们就要对这个结果继续累加,直到最后的结果是个位数,那么 12345 的数根就是 1+5=6 了。

    对于这个问题,最开始我所想到的解法就是通过循环不断地取余,并将结果相加后得到答案。

    当然,对于这个问题我们也可以使用递归来做,这样代码量会小不少。

    然后直到我看到了下面这个答案:

    1. int f(int n) {
    2. return (n - 1) % 9 + 1;
    3. }

    然后我就呆了,对我而言,这根本就是降维打击……

    当然,对于这个问题,也有各路大神在知乎的另一个问题下「如何证明一个数的数根(digital root)就是它对9的余数? - 知乎」给出各种不一样的证明思路,有兴趣的同学可以去看看。