数字的总和是多少?

时间:2017-10-18 11:19:25

标签: functional-programming division modular-arithmetic oz

我是编程的新手。我一直在解决函数式编程(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对吗?我在这里失踪了什么。我为问这么简单的问题而道歉,但任何帮助都会受到赞赏。 谢谢:))

4 个答案:

答案 0 :(得分:1)

你错过了最重要的事情。 它应该在一个循环中发生,每次N的值都会改变。

例如 在第一次迭代中 Div给出1,mod给出6,所以你加1和6并存储结果,数字也被修改(它变成2345) 在第二次迭代中 div给出2,mod给出5你加2 + 5 +以前的结果,数字也被修改.. 这一直持续到数字变为零

答案 1 :(得分:1)

你的函数是递归的,所以每次数字变小时,直到只有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}}

答案 2 :(得分:0)

我认为最优雅的方式是函数-

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

}

简单而真实:-)

答案 3 :(得分:0)

int main()
{
  int n,m,d,s=0;
  scanf("%d",&n);
  m=n;
  while(m!=0)
 {
       d=m%10;
       s=s+d;
       m=m/10;
 }
printf("Sum of digits of %d is %d",n,s);
}