views:

315

answers:

6

I'm searching for an algorithm for Digit summing. Let me outline the basic principle:

Say you have a number: 18268.

1 + 8 + 2 + 6 + 8 = 25

2 + 5 = 7

And 7 is our final number. It's basically adding each number of the whole number until we get down to a single (also known as a 'core') digit. It's often used by numerologists.

I'm searching for an algorithm (doesn't have to be language in-specific) for this. I have searched Google for the last hour with terms such as digit sum algorithm and whatnot but got no suitable results.

Any help would be great, thanks.

+3  A: 

I would try this:

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;
}
Grimmy
you'll want to do this over and over until abs(total) is less than 10 and then you'll have your core number.
Chad
that does not seemed right. you are doing only one summation. you need another loop or recursion
aaa
A: 
  1. Mod the whole number by 10.
  2. Add the number to an array.
  3. Add the whole array.
Redburn
+1 for providing a good starting point but not doing the OP's homework.
Bob Kaufman
It's not homework, Bob. :) And thank you for the starting point, I can work out in the head where it's going ;)
Joe
+2  A: 

Googling for 'numerology digit sum algorithm' gives this:

http://wiki.answers.com/Q/Algorithm_to_find_the_sum_of_digits_of_a_given_number

Put a loop around it to sum the result if greater than a single digit, and you're done.

ire_and_curses
+2  A: 

Doesn't work with negative numbers, but I don't know how you would handle it anyhow. You can also change f(x) to be iterative:

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

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

You can also take advantage of number theory, giving you this f(x):

f( x ) =
    if ( x == 0 ) return 0
    return x % 9
Larry
+16  A: 

Because 10-1=9, a little number theory will tell you that the final answer is just n mod 9. Here's code:

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

Example: 18268%9 is 7. (Also see: Casting out nines.)

ShreevatsaR
need to loop it
Timmy
No, you can work that out.
Larry
@Timmy: No, you don't need to loop. Get pen and paper, and work it out for yourself. (It works because the sum of digits is an invariant modulo 9.)
ShreevatsaR
Thanks for reminding me to analyze the problem *before* I code the obvious solution.
Noah Lavine
The "obvious" solution took most of the people here less than 5 minutes, and the running time isn't too high, so perhaps you could've done that anyhow! ;P
Larry
srry, cant undo it unless u edit
Timmy
@Larry: Yes, but we could have spent those 5 minutes thinking, and finally coming to THE correct answer (which is also obvious, in a way). It's the "fastest gun in the west problem", see http://meta.stackoverflow.com/questions/9731/fastest-gun-in-the-west-problem
Federico Ramponi
A much easier solution. Thank you Shree :)
Joe
I think it's important to analyze algorithms itself -- sure the brute force algorithm is slower, but how much of a factor? f(10^x-1) = 9*(x-1). So even if you have a number with a million digits it will take fractions of a second. Now, of course the numbers changes with Stack Overflow (and Google), where you can just ask someone and get it in 5 minutes, but I don't know if I would've came up with it in 5 minutes without a nudge in what I should do -- I happened to know it as trivia from experience. (A long way of saying, don't prematurely optimize if you don't have to!)
Larry
A: 
int number = 18268;
int total = 0;

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