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