我正在创建两种方法-一种递归地计算数字中的数字之和,另一种迭代地。
我已经创建了递归方法,并且在大多数情况下,我了解查找数字总和的概念,但是我不确定如何正确地将其放入迭代方法中。我的代码没有给我正确的输出。
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。请您向我解释我做错了什么,以及可能如何解决?非常感谢。
答案 0 :(得分:0)
该算法基本上包括三个步骤:
获取数字的最右侧数字。由于数字中的每个数字根据其位置都有单位,数十,数百,数千个等的排名,因此最右边的数字是将数字除以10的余数:
digit = n % 10
对数字求和:
sum += digit
将数字除以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
希望有帮助。