2010-04-21 2 views
11

Я ищу алгоритм для суммирования цифр. Позвольте мне изложить основной принцип:Алгоритм суммирования цифр?

Скажите, что у вас есть номер: 18268.

1 + 8 + 2 + 6 + 8 = 25 

2 + 5 = 7 

И 7 - наш окончательный номер. Это в основном добавляет каждый номер целого числа, пока мы не спустимся до одной (также известной как «ядро») цифры. Он часто используется нумерологами.

Я ищу алгоритм (для этого не обязательно должен быть конкретный язык). Я искал Google в течение последнего часа с такими терминами, как digit sum algorithm и еще не получил подходящих результатов.

Любая помощь будет большой, спасибо.

+0

домашнее задание? о чем вы думали до сих пор? – Anycorn

+0

См. Также: http://stackoverflow.com/questions/478968/sum-of-digits-in-c –

+0

Нет, не домашнее задание. Хотя я могу понять, как вы его допустили. Самое сложное, что мы делаем в колледже, это обработка файлов. : P – Joe

ответ

29

Поскольку 10-1 = 9, немного теории чисел будет сказать вы что окончательный ответ просто п моднику 9. Вот код:

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

Пример: 18268% 9 7. (Также см. Casting out nines)

+0

нужно зацикливать – Timmy

+3

Нет, вы можете это исправить. – Larry

+2

@Timmy: Нет, вам не нужно зацикливаться. Возьмите ручку и бумагу и сделайте все для себя. (Это работает, потому что сумма цифр является инвариантом по модулю 9.) – ShreevatsaR

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; 
} 
+0

, вы захотите сделать это снова и снова, пока абс (всего) меньше 10, а затем вы будете иметь ваш основной номер. – Chad

+0

, что не кажется правильным. вы делаете только одно суммирование. вам нужен еще один цикл или рекурсия – Anycorn

1
  1. Mod целое число на 10.
  2. Добавить номер в массив.
  3. Добавить весь массив.
+1

+1 для обеспечения хорошей отправной точки, но не выполнение домашней работы OP. –

+0

Это не домашнее задание, Боб.:) И спасибо за отправную точку, я могу работать в голове, где это происходит;) – Joe

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 
0
int number = 18268; 
int total = 0; 

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

это от очень давно, но самое лучшее решение, которое я для этого:

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

Я не знаю, насколько лучше это, но это будет приходиться легко делится на 9 чисел. Просто классный алгоритм.

Смежные вопросы