0

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

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

  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。你能解释一下我做错了什么,以及如何解决它吗?太感谢了。

4

1 回答 1

0

基本上,该算法包括三个步骤:

  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

希望能帮助到你。

于 2019-06-03T05:04:43.153 回答