Сумма цифр числа?

Я новичок в программировании. Здесь я решал простую задачу функционального программирования (OZ), которая заключается в нахождении суммы цифр 6-значного положительного целого числа. Пример:- if n = 123456, затем output = 1+2+3+4+5+6 which is 21. здесь я нашел решение, как показано ниже

fun {SumDigits6 N}
{SumDigits (N Div 1000) + SumDigits (N mod 1000)}
end

и он говорит, что аргумент (N Div 1000) дает первые 3 цифры, а аргумент (N mod 1000) дает нам последние 3 цифры. и да, я получаю правильное решение, но я сомневаюсь, как они могли дать правильные решения. Я имею в виду, что в данном примере не (N Div 1000) of 123456 дает 123 правильно, а не 1+2+3 и аналогично (N mod 1000) of123456 дает нам 456 не 4+5+6 верно?. в этом случае ответ должен быть 123+456, что равно 579, а не 21 верно? чего мне здесь не хватает. Я прошу прощения за такой простой вопрос, но любая помощь будет оценена по достоинству. Спасибо :)


person læran91    schedule 18.10.2017    source источник


Ответы (4)


Вы упускаете самое главное здесь. Предполагается, что это происходит в цикле и каждый раз, когда значение N изменяется.

Например, в первой итерации Div дает 1, а mod дает 6, поэтому вы добавляете 1 и 6 и сохраняете результат, и число также изменяется (оно становится 2345), во второй итерации div дает 2, а mod дает 5, вы добавляете 2 +5+предыдущий результат, и число также изменяется.. Это продолжается до тех пор, пока число не станет равным нулю

person Saram ali    schedule 18.10.2017

Ваша функция является рекурсивной, поэтому каждый раз, когда число становится меньше, пока не станет просто 0, оно возвращается, суммируя весь частичный результат. Вы можете сделать это с помощью аккумулятора для сохранения результата следующим простым способом:

declare
fun {SumDigit N Accumulator}
 if N==0 then Accumulator
 else {SumDigit (N div 10) Accumulator+(N mod 10)}
 end
end

{Browse {SumDigit 123456 0}}
person rok    schedule 04.11.2017

я думаю, что самый элегантный способ - это функция --

static int SumOfDigit(int n)
 {
if (n < 10) return n;
return SumOfDigit(SumOfDigit(n/10)+n%10);

}

просто и верно :-)

person ofer hadad    schedule 27.11.2018
comment
Похоже, это не работает: SumOfDigit(19) = SumOfDigit(SumOfDigit(1) + 9) = SumOfDigit(1 + 9) = SumOfDigit(10) = SumOfDigit(SumOfDigit(1) + 0) = SumOfDigit(1 + 0) = Сумма цифр (1) = 1 - person Gabriel Devillers; 28.11.2018

person    schedule
comment
Хотя этот фрагмент кода может быть решением, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. - person Mickael B.; 07.05.2020
comment
Хотя этот код может решить проблему OP, лучше добавить контекст или объяснение того, почему это решает проблему OP, чтобы будущие посетители могли учиться на вашем посте и применять эти знания к своим собственным проблемам. Ответы высокого качества с гораздо большей вероятностью получат одобрение и внесут свой вклад в ценность и качество SO как платформы. Вы также можете добавить ссылку на документацию, если это поможет. - person SherylHohman; 07.05.2020