以下两种方法有效。
public static int sumInt(int num) {
int sum;
for (sum = 0; num != 0; num = num/10) {
sum += num % 10;
}
return sum;
}
和
public static int sumInt(int num) {
int sum = 0;
while (num != 0) {
sum+= num%10;
num = num/10;
}
return sum;
}
但是我想知道程序将输入作为字符串读取,然后使用 charAt() 检查字符串的每个索引,然后从每个索引中减去“0”并将它们加在一起。 它可能没有那么有效,但是可以做到吗? 这是我到目前为止所拥有的,但不太正确:
import java.util.Scanner;
public class SumDigitsString {
public static void main (String[] args ) {
Scanner input = new Scanner (System.in);
System.out.print("Enter an integer: ");
String number = input.next();
System.out.println("\nThe sum of the digits of " + number + " is " + sumInt(number));
}
public static String sumInt(String num) {
int sum = 0;
while (num.length() - num.charAt() > 0)
sum += (num.charAt(num.length())) + '0';
num.charAt()++;
return sum;
}
}
你能做的是:
public static int sumInt(String num) {
int sum = 0;
for (int i = 0; i<num.length(); i++)
sum += num.charAt(i) - '0';
return sum;
}
如果您取出索引 i 处的字符并减去“0”,您将根据 ASCII 表获得该字符的值,然后当您将其添加到 sum 时,它会隐式转换为整数。
嗯,你为什么不直接使用
nextInt()
来代替呢?我认为依赖 Java 库(这些库总是由社区尝试和测试)总是比自己重写代码更好:-)
Scanner input = new Scanner(System.in);
System.out.println("Enter an integer: ");
int number = input.nextInt();
// Call your old sumInt(int) method
System.out.println("\nThe sum of the digits of " + number + " is " + sumInt(number));
我认为你没有正确使用
charAt
。我认为 num.charAt()++
在语法上也不正确。你应该做这样的事情:
public static int sumInt(String num) {
int sum = 0;
for (int i = 0; i < num.length(); i++) {
sum += (num.charAt(i) - '0');
}
return sum;
}
您可以按照以下方式进行:
public static int sumInt(String num) {
int sum = 0, i = 0;
while (i < num.length()) {
char ch = num.charAt(i);
if (Character.isDigit(ch)) {
sum += ch - '0';
i++;
} else {
throw new IllegalArgumentException(num + " is not a whole number.");
}
}
return sum;
}
示例运行:
Enter an integer: 1234
The sum of the digits of 1234 is 10
另一个示例运行:
Enter an integer: 12a34
Exception in thread "main" java.lang.IllegalArgumentException: 12a34 is not a whole number.
at Main.sumInt(Main.java:20)
at Main.main(Main.java:9)
这个想法是将每个数字的数值添加到用
sum
初始化的变量(上面给出的代码中的 0
)。请注意,检查字符是否是数字也很重要,如果不是则抛出一些异常。
'0'
的ASCII值为48,因此要得到'0'
的数值,需要从'0'
减去48
或'0'
。同样,'1'
的 ASCII 值为 49,因此要获得 '1'
的数值,您需要从 '0'
中减去 48
或 '1'
。综上所述,为了得到数字字符的数值,我们需要从中减去 '0'
或 48
。
这也可以用递归来解决。此任务有两种递归方法:
方法#1:保留标志
public static int digitsSum(int n) {
if (Math.abs(n) > 9) {
return n % 10 + digitsSum(n / 10);
}
return n;
}
方法#2:使用绝对值(无符号)
public static int absDigitsSum(int n) {
if (Math.abs(n) > 9) {
return Math.abs(n % 10) + absDigitsSum(Math.abs(n) / 10);
}
return n;
}
测试两种方式:
public static void main(String[] args) {
int sum1 = digitsSum(-125);
System.out.println(sum1);
int sum2 = digitsSum(125);
System.out.println(sum2);
System.out.println(" ");
int sum3 = absDigitsSum(-125);
System.out.println(sum3);
int sum4 = absDigitsSum(125);
System.out.println(sum4);
}
终端上的结果
-8
8
8
8