【问题标题】:Sum all digits of a number and show the digits separately in Java将数字的所有数字相加并在Java中分别显示数字
【发布时间】:2025-12-10 19:00:02
【问题描述】:

我经常使用这个网站,但我从来没有真正写过任何东西。 今天,我偶然发现了一个我似乎找不到解决方案的问题。

问题是,我有一个未知位数的int variable。要求我将所有这些数字相加,然后将其打印/shown_as_a_message 并将所有这些数字分开。

例如,用户输入数字“12345678”,最后我需要一条消息说“数字 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36”。我知道如何分离和总结所有这些数字,但我不知道如何保存每个数字然后显示它,因为我不仅不知道正确的数字数量,而且我不知道它们的值要么。

通常这不难做到,但对我来说棘手的部分来了,因为我们还没有学习arraysstrings、索引等东西,我们不允许使用他们。所以,我应该用最简单的代码来做。

到目前为止,我得到了以下内容:

import java.util.Scanner;
public class Numbers {
    public static void main(String[] args) {
        int number, result;
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number:");
        number = sc.nextInt();
        result = 0;
        while (number > 0){
            result = result + (number % 10);
            number = number / 10;
        }
        System.out.println("This is where the message would go.");
    }
}

【问题讨论】:

  • 那么这段代码又有什么问题?它似乎在你的约束下完成了这项工作
  • 如果您不能使用字符串,您将如何打印任何内容?一次一个字符?
  • 尝试将每个数字保存在一个字符串中,可能你应该在使用 charAt 循环之前将其反转并打印“1+2+3+ ..”版本
  • 不能使用 String 和 charAt。我只写完整的数字并使用大部分数字。
  • "12345678".replaceAll("\\B", " + ")1 + 2 + 3 + 4 + 5 + 6 + 7 + 8

标签: java numbers digits


【解决方案1】:
static final Scanner input = new Scanner(System.in);

public static void main(String[] args) {
    int number, result;
    System.out.println("Enter number:");
    number = input.nextInt();
    result = 0;
    System.out.print("The numbers: ");

    //Reverses the number
    int reversedNum = 0;
    while (number != 0) {
        reversedNum = reversedNum * 10 + number % 10;
        number = number / 10;
    }

    //Iterates over the number and prints it out
    while (reversedNum > 0) {
        System.out.print((reversedNum % 10));

        result = result + (reversedNum % 10);
        reversedNum = reversedNum / 10;

        if (reversedNum > 0) {
            System.out.print(" + ");
        }
    }
    System.out.println(" = " + result);
}

这可以在不使用数组和字符串的情况下以正确的顺序打印出所有数字。

例子:

Enter number:
12345
The numbers: 1 + 2 + 3 + 4 + 5 = 15
BUILD SUCCESSFUL (total time: 5 seconds)

【讨论】:

    【解决方案2】:

    也许是这样的,你不使用任何类型的容器。每次找到一个新数字时,只需连接到字符串。

        int number, result;
        String finalOutput = "";
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number:");
        number = sc.nextInt();
        result = 0;
    
        while (number > 0){
            result = result + (number % 10);
    
            finalOutput += (number % 10);
    
            number = number / 10;
            if(number > 0)
            {
                finalOutput += " + ";
            }else{
                finalOutput += " = ";
            }
        }
        System.out.println("The numbers " + finalOutput + result);
    

    【讨论】:

    • 请注意,这将反向打印数字:8 + 7 + ...。所需的输出是1 + 2 + ...
    • 即使是反过来,也是有的。看起来非常有趣。谢谢。
    【解决方案3】:

    您想在循环时打印出这些数字。例如:

    while (number > 0){
         System.out.print( (number % 10) + " + " );
         result = result + (number % 10);
         number = number / 10;
    }
    

    您仍然需要正确设置输出格式。

    【讨论】:

    • 这很有趣。我也许可以用类似的东西想出一些东西。谢谢。
    【解决方案4】:

    一年前我有过类似的任务。基本上我所做的是使用String.valueOf(int)Integer.toString(int) 也可以)将输入的整数转换为字符串,然后将该字符串中的每个字符转换回整数并将它们添加到总和中。

    Scanner sc = new Scanner(System.in);
    
    int sum= 0;
    
    System.out.println("Number?");
    int num = sc.nextInt();
    sc.close();
    
    String countNum = String.valueOf(num);
    
    for(int i = 0; i < countNum.length(); i++) {
       int j = Character.digit(countNum.charAt(i), 10);
       sum += j;
    }
    System.out.println("The sum is: " + sum);
    

    【讨论】:

    • 我不能使用 String、countNum.length、Character.digit 和 charAt。
    【解决方案5】:

    如果您可以使用正则表达式,并且只是想在所有数字之间插入一个由空格包围的加号,您可以使用replaceAll() 方法:

    "12345678".replaceAll("\\B", " + ") // returns "1 + 2 + 3 + 4 + 5 + 6 + 7 + 8"
    

    \\B 是用于匹配 不是 分词符的字符之间的空位置的正则表达式(\\b 将是 分词符的位置)。由于输入是由所有数字组成的单个“单词”,因此值的开头和结尾是分词,数字之间的位置不是分词。

    replaceAll() 然后将数字之间的所有空格替换为" + ",您就可以在一个简单的表达式中得到您想要的。

    【讨论】:

    • 这本来是解决方案,但 Squiddie 告诉我“123456789”创建了一个字符串。 :(
    【解决方案6】:

    你可以递归地做:

    int number,result;
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter number:");
    number = sc.nextInt();
    //sum to the result and print last digit and the result
    int last = number%10;
    result = reverse(number/10);
    System.out.print(last + " = "+ (result + last));
    

    递归方法,打印字符串并计算总和(最后一位除外):

    private static int reverse(int number) {
        if(number>0){
            int p = number % 10 + reverse(number/10);
            System.out.print(number % 10 + " + ");
            return p;
        }
        return 0;
    }
    

    【讨论】:

    • 很遗憾,我不能使用 s.append、s.reverse、s.lenght 和 s.charAt。
    • @DoombringerBG 我更新了答案。我是递归的。
    【解决方案7】:

    (代表 OP 发布)

    卢克·梅莱亚解决了!

    另一件事可能对人们谷歌有所帮助:

    使用字符串的最短解决方案 -> "12345678".replaceAll("\B", " + ") ➜ 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 – Andreas

    user6904265提供的递归解决方案。

    感谢大家的大力帮助。非常感激。

    【讨论】:

      【解决方案8】:

      在Java8的帮助下,你可以这样做:

      public int sumNumber(int number) {
              return String.valueOf(number).chars().map(Character::getNumericValue).sum();
          }
      

      这可能对某人有所帮助。

      【讨论】: