【问题标题】:How to calculate the sum of digits in a number iteratively - java/bluej如何迭代地计算数字中的数字总和 - java/bluej
【发布时间】:2019-05-06 18:24:33
【问题描述】:

我正在创建两种方法 - 一种以递归方式计算数字中的数字之和,另一种以迭代方式计算。

我已经创建了递归方法,并且在大多数情况下我了解查找数字总和的概念,但我不确定如何正确地将其放入迭代方法中。我的代码没有给我正确的输出。

  public static int iterativeDigitSum(long n) {
        if(n < 0){ 
           String err = "n must be positive. n = " + n;
         throw new IllegalArgumentException(err);
       }
     if(n == 0){
           return 0;
       }

        long sum = 0;
        long i = 0;
     while(n > 0){
             i = n % 10;
             sum = sum + n;
             n = n / 10;
       }
       int inSum = (int)sum;
       return inSum;
}

数字“n”是 10,意味着预期的输出是 1。我得到 11。你能解释一下我做错了什么,以及如何解决它吗?非常感谢。

【问题讨论】:

  • 我想通了。我删除了“i”变量并将“sum”更改为 sum + n % 10。我不确定为什么会这样,所以如果有人解释,我仍然会很感激。
  • 我在下面的回答中提供了解释和可视化方法。

标签: iteration bluej sum-of-digits


【解决方案1】:

算法基本上由三个步骤组成:

  1. 获取号码的最右边位。由于数字中的每个数字根据其位置都有一个单位、十、百、千等等级,因此最右边的数字是 将该数字除以 10 的余数

    digit = n % 10

  2. 将数字相加:

    sum += digit

  3. 将数字除以 10 将所有数字向右移动一位。数字变小 10 倍:

    n = n / 10

    实际上,这将为第 1 步“提供”下一个最右边的数字。

重复以上三个步骤,直到number的值变为零。

您可以通过在代码中添加一些“调试”信息来帮助自己可视化上述解释:

public static int iterativeDigitSum(long n)
{
    long sum = 0;
    int i = 1;
    System.out.println("i\tn\tdigit\tsum");        
    while(n > 0) {
        long digit = n % 10;
        sum += digit;            
        System.out.println(i + "\t" + n + "\t" + digit + "\t" + sum);
        n = n / 10;
        i++;
    }
    System.out.println("\t" + n + "\t\t" + sum);
    return (int)sum;
}

请注意,i 变量用于计算循环迭代次数,digit 变量保存每次迭代中最右边的数字。

给定数字 10,BlueJ 控制台的输出是:

i   n     digit   sum
1   10    0       0
2   1     1       1
    0             1

对于 2019 年的数字:

i   n       digit   sum
1   2019    9       9
2   201     1       10
3   20      0       10
4   2       2       12
    0               12

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多