仅使用while循环、乘法、除法、加法和减法计算十字总和

4

如何使用while循环、加、减、乘、除这些基本的数学运算符计算十进制数的各位数字之和(例如:516 = 5 + 1 + 6 = 12)?我想使用模运算,但不知道如何仅使用所提到的基本数学术语来复制它。


3
这个想法或许能帮到你:a mod b = a - ((a ÷ b) × b) - Gassa
这个问题有点重复了,参考这个问题 - KillerPollo
可能是如何在Java中对整数的数字求和?的重复问题。 - Paul Hankin
我相信这被称为 digital-sum 或者也可能是 digital-root,我记不清了。无论如何,如果我没记错,在维基百科上有一个超级简单的带有模数的公式,不需要循环。 - Albert Renshaw
1
允许的“除法”是否为整数除法——即div//而不是/(在Python 3中是后两者)? - Rory Daulton
2个回答

1
假设你所说的除法是浮点数除法;否则,你可以使用 floor-division 编写自己的 mod 操作。
这里是一个使用循环和比较枚举数字并对它们求和的 O(n) 时间、O(1) 空间算法(其中 n 是数字的位数)。
JavaScript 代码:

function crossSum(num){
  // Find the largest power of ten and number of digits, O(n)
  var power = 1,
      numDigits = 1;
      
  while (power * 10 <= num){
    power = power * 10;
    numDigits++;
  }
  
  // Calculate cross sum, O(constant * n) = O(n)
  var sum = 0,
      digit;
  
  while (num > 0){
    digit = 0;
    
    while ((digit + 1) * power <= num)
      digit++;
      
    console.log(digit)
    sum = sum + digit;
    num = num - power * digit;
    power = power / 10;
  }
  
  return sum;
}

console.log(crossSum(516));


-1

数字和

这个公式不需要循环,是从维基百科关于数字和的页面中提取的。

enter image description here

当然,这里使用了指数和模运算,这不是您列出的操作符之一,但这种限制在任何现代编程语言中都不存在,这让我相信它不是真正的限制或者这是一个家庭作业问题。无论如何,StackOverflow作为未来程序员解决问题的参考,我相信这是数字和问题的解决方案,因此我在这里列出它供未来读者参考。您不必接受这个答案,因为它不是一个真正的答案,而更多是其他人的参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接