数字求和的算法?

12

我正在寻找一个数字求和的算法。让我概述一下基本原理:

假设你有一个数字:18268

1 + 8 + 2 + 6 + 8 = 25

2 + 5 = 7

7是我们的最终数字。它基本上是将整个数字的每个数字相加,直到我们得到一个单独的(也称为“核心”)数字。这经常被数理算命师使用。

我正在寻找一个算法(不必考虑特定语言),用于实现这一过程。我已经用诸如“数字总和算法”之类的术语在谷歌上搜索了一个小时,但没有找到合适的结果。


作业?你目前想到了什么? - Anycorn
参见:https://dev59.com/3nRB5IYBdhLWcg3w4bGv - e.James
不是作业。虽然我能理解你会误解。我们在大学里做的最难的编程事情就是文件处理。:P - Joe
这个链接:http://stackoverflow.com/questions/2115731/i-want-a-function-in-vb-script-to-calculate-numerology - ire_and_curses
非常感谢您,ire :) 没问题aaa,我应该在问题中说明这不是作业。 - Joe
1
你的“核心”也被称为“数字根”。http://en.wikipedia.org/wiki/Digital_root - polygenelubricants
8个回答

31

因为10-1=9,一些小的数论知识可以告诉你最终答案就是n mod 9。以下是代码:

ans = n%9;
if(ans==0 && n>0) ans=9; 
return ans;

例子:18268%9 是7。(还可参考: Casting out nines。)


2
@Timmy:不,你不需要循环。拿起笔和纸,自己算一下就行了。(这个方法有效是因为数字的各位数之和对于模9来说是一个不变量。) - ShreevatsaR
谢谢你提醒我在编写显而易见的解决方案之前先分析问题。 - Noah Lavine
1
“显而易见”的解决方案对于这里的大多数人来说不到5分钟就能完成,运行时间也不太长,所以或许你本来就可以做到!;P - Larry
@Larry:是啊,但我们本可以花这五分钟思考并最终得出正确答案(其实显而易见)。这就是所谓的“西部最快枪手问题”,请参考http://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem。 - Federico A. Ramponi
一个更简单的解决方案。谢谢Shree :) - Joe
1
我认为分析算法本身很重要——虽然暴力算法较慢,但它有多大的因素呢?f(10^x-1) = 9*(x-1)。所以即使你有一个百万位数的数字,也只需要几分之一秒的时间。当然,现在随着Stack Overflow(和Google)的出现,数字会发生变化,你可以向别人询问并在5分钟内得到答案,但如果没有提示,我不知道我是否能在5分钟内想出来该怎么做——我碰巧从经验中知道这个小知识点。(长话短说,如果不必要,不要过早地进行优化!) - Larry

3
我建议尝试这个方法:
int number = 18268;
int core = number;
int total = 0;

while(core > 10)
{
   total = 0;
   number = core;
   while(number > 0)
   {
      total += number % 10;
      number /= 10;
   }

   core = total;
}

你需要一遍又一遍地执行此操作,直到 abs(total) 小于 10,然后你就得到了你的核心数字。 - Chad
这似乎不正确。你只进行了一次求和。你需要另一个循环或递归。 - Anycorn

2

不支持负数,但我也不知道你会如何处理。你还可以将f(x)更改为迭代形式:

sum( x ) =
    while ( ( x = f( x ) ) >= 10 );
    return x;

f( x ) = 
    if ( x >= 10 ) return f( x / 10 ) + x % 10
    return x

您还可以利用数论,得到这个f(x)函数:
f( x ) =
    if ( x == 0 ) return 0
    return x % 9

1
  1. 将整数模以10取余。
  2. 将该数字添加到数组中。
  3. 将整个数组相加。

2
提供一个良好的起点,但不要替OP完成作业。 - Bob Kaufman
这不是作业,Bob。 :) 谢谢你提供的起点,我可以在脑海中想出它的方向 ;) - Joe

0
    private static int sum(long number) {
    int sum = 0;
    if (number == 0) {
        return 0;
    }
    do {
        int last = (int) (number % 10);
        sum = (sum + last) % 9;
    } while ((number /= 10) > 0);

    return sum == 0 ? 9 : sum;
}

0

这是很久以前的事情了,但我对此最好的解决方案是:

int digitSum(int num){
    if (num < 10) return num;
    else return (n-1)%9+1;
}

我不知道这个算法有多好,但它可以轻松处理可被9整除的数字。真是一个很酷的算法。


0
int number = 18268;
int total = 0;

while(number > 0)
{
   total += number % 10;
   total = total%10;
   number /= 10;
}

0
public int DigitSum(long n)
  {
     return (int)(1 + (n - 1) % 9);
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接