【问题标题】:Sum of the digits of a number?数字的位数之和?
【发布时间】:2017-10-18 11:19:24
【问题描述】:

我是编程新手。在这里,我一直在解决函数式编程 (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 给我们456 不是4+5+6 对吗?在这种情况下,答案应该是123+456 等于579 而不是21 对吧?我在这里缺少什么。对于提出如此简单的问题,我深表歉意,但我们将不胜感激。 谢谢你:)

【问题讨论】:

    标签: functional-programming division modular-arithmetic oz


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        }

        简单而真实:-)

        【讨论】:

        • 这似乎不起作用: SumOfDigit(19) = SumOfDigit(SumOfDigit(1) + 9) = SumOfDigit(1 + 9) = SumOfDigit(10) = SumOfDigit(SumOfDigit(1) + 0 ) = SumOfDigit(1 + 0) = SumOfDigit(1) = 1
        【解决方案4】:
        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);
        } 
        

        【讨论】:

        • 虽然此代码 sn-p 可能是解决方案,但包含解释确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        • 虽然此代码可能会解决 OP 的问题,但最好添加上下文,或解释为什么这会解决 OP 的问题,以便将来的访问者可以从您的帖子中学习,并将这些知识应用于他们自己的问题。高质量的答案更有可能获得支持,并有助于提升 SO 作为平台的价值和质量。如果有帮助,您还可以添加文档链接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 2022-07-12
        • 2020-01-25
        • 1970-01-01
        • 2014-04-06
        • 2010-11-30
        相关资源
        最近更新 更多