1

我是编程新手。在这里,我一直在解决函数式编程(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 123456123不正确的1+2+3,同样(N mod 1000) of123456给我们4564+5+6正确的?在那种情况下,答案应该是123+456哪个等于57921正确?我在这里缺少什么。对于提出如此简单的问题,我深表歉意,但我们将不胜感激。谢谢 :)

4

4 回答 4

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}}
于 2017-11-04T17:12:37.580 回答
1

你在这里错过了最重要的事情。它应该发生在一个循环中,并且每次 N 的值发生变化。

例如,在第一次迭代中,Div 给出 1,mod 给出 6,因此您将 1 和 6 相加并存储结果,并且数字也被修改(变为 2345)在第二次迭代中,div 给出 2,mod 给出 5,您添加 2 +5+之前的结果,数字也被修改了..这样一直持续到数字变为零

于 2017-10-18T11:25:48.710 回答
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);
} 
于 2020-05-07T02:24:58.137 回答
0

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

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

}

简单而真实:-)

于 2018-11-27T22:05:13.360 回答