【问题标题】:Printing from a loop从循环打印
【发布时间】:2016-02-16 14:48:08
【问题描述】:

我需要打印一个完美数的因数。这是我的主要课程的要点:

ArrayList<Integer> perfNums = new ArrayList<>();
Scanner in = new Scanner(System.in);
System.out.print("Enter the upperbound: ");
upperbound = in.nextInt();
for (int i = 1; i <= upperbound; i++) {
     if (isPerfect(i)) { //boolean to check if number is a perfect number
        perfNums.add(i);
     }
}

System.out.println("Perfect numbers between 1 and " + upperbound + " are:");
for (int i = 0; i < perfNums.size(); i++) {
     System.out.print(perfNums.get(i) + " = ");
     printFactor((int)perfNums.get(i));
     System.out.println();
}

这是 printFactor 类。

private static void printFactor(int number){
    int factor = 1;
    while(factor < number){
        if (number%factor == 0) System.out.print(factor+ " + ");
        //I don't know how to print the + sign otherwise.
        factor++;
    }
}

这是一个示例输出:

Enter the upperbound: 10000
Perfect numbers between 1 and 10000 are:
6 = 1 + 2 + 3 + 
28 = 1 + 2 + 4 + 7 + 14 + 
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 + 
8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 + 

我已经掌握了它的主要要点,但我一直在努力解决输出问题。由于我的在线提交系统的限制,我的输出需要符合确切的规范。

我的问题是如何打印我的完美数的所有因数但删除末尾的 + 号?(例如)6 = 1 + 2 + 3

我不太确定从 while 循环中打印的许多方法。 for 循环会更好地实现我的目标吗?或者是否有其他方法可以打印数字的因数?

【问题讨论】:

  • for 循环可能无济于事,因为它只是另一种循环。您可以做的是将因素收集到一个列表中,然后打印该列表,即循环它并在每个元素之前打印一个 +,但列表中的第一个(或每个元素之后但最后一个)。
  • 使用List 然后StringJoiner 怎么样?或者更好的是,Java 8 流和collect()
  • 如果您想使用您的代码:使用 2 个打印语句并首先打印 + 如果您在之前的一次迭代中打印了一个因子(在方法中使用布尔值来跟踪它或检查当前因子不是 1,因为它始终是第一个)。
  • 添加到@m0skit0 所说的内容,这可能是最好的方法,StringJoiner 只有在使用 java 8 时才可用
  • 您可以在循环之前打印1,在2 开始factor,并在循环中的每个数字之前打印" + "

标签: java loops while-loop numbers factors


【解决方案1】:

解决此问题的最少更改可能是这样的:

private static void printFactor(int number) 
    System.out.print(1);
    int factor = 2;
    while (factor<number) {
        if (number%factor == 0) System.out.print(" + " + factor);
        factor++;
    }
}

1 始终是一个因子,因此您可以在循环之前打印它,然后将 + 添加到每个后续因子。

【讨论】:

  • 我怎么没想到呢?非常感谢!
【解决方案2】:

您应该将要打印的输出缓存到StringBuilder。然后,您可以在打印整个 String 之前删除最后一个加号。它还具有更好的性能。

private static void printFactor(int number)
{
    StringBuilder output = new StringBuilder();
    int factor = 1;
    while (factor < number)
    {
        if (number % factor == 0)
            output.append(factor + " + ");
        factor++;
    }
    // remove last plus sign
    output.deleteCharAt(output.length() - 1);
    // print the whole string
    System.out.print(output.toString());
}

【讨论】:

  • 我建议在output 上调用trimdeleteCharAt 之前。这样做的目的是在删除最后一个字符(+)之前删除尾随空格。
【解决方案3】:

由于factor 从值 1 开始,number % 1 == 0 将始终为真,因此您可以先打印 1,然后在 System.out.print 中翻转 factor+。像这样:

private static void printFactor(int number) {
    if(number > 0) {
        System.out.print(1);
    }
    int factor = 2;
    while (factor<number) {
        if (number % factor == 0) {
            System.out.print(" + " + factor);
        }
        factor++;
    }
}

不是最好的解决方案,但它会完成这项工作。

【讨论】:

    【解决方案4】:

    尝试创建一个变量字符串numb并使用substring这样的方法:

          String numb ="";
            while(factor<number){
                if(number%factor == 0) 
                    numb= numb + factor+ " + ";
                factor++;
            }
            System.out.print(numb.substring(0, numb.trim().length()-1));
    

    【讨论】:

      【解决方案5】:

      只是为了使用 Java 8 :)

      private static void printFactor(int number){
          System.out.println(IntStream.range(1, number)
                                      .filter(p -> number % p == 0)
                                      .mapToObj(i -> String.valueOf(i))
                                      .collect(Collectors.joining(" + ")));
      }
      

      【讨论】:

        【解决方案6】:

        感谢大家的快速回复。你们都是救命稻草,当我将来编码时,我设法找到了一些新的东西要考虑。

        无论如何,在等待回复时,我正在摆弄代码并想出了一个相当不雅的解决方案,如果有人感兴趣的话。以下是对主类的更改:

        System.out.println("Perfect numbers between 1 and " + upperbound + " are:");
             for(int i=0; i<perfNums.size(); i++){
                 System.out.print(perfNums.get(i) + " = ");
                 outputString = printFactor2(perfNums.get(i));
                 if(outStr.endsWith(" + ")) outStr = outStr.substring(0, outStr.length()-3); 
                 //because the submission system would cry foul with even a single extra space
                 System.out.println(outStr);
             }
        

        以下是对 printFactor 类的更改:

        private static String printFactor2(int number){
            String out = "";
            int factor = 1;
            while(factor<number){
                if(number%factor == 0) out += factor + " + ";
                factor++;
            }
            return out;
        }
        

        基本上,我所做的是将因子附加到字符串,然后使用 substring 方法删除尾随的 + 符号。事后看来,我可能应该在 printFactor 类中调用 substring 方法。可能是return out.substring(0, out.length()-3); 之类的东西?

        不过还是谢谢大家!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-17
          • 1970-01-01
          • 2015-11-01
          • 1970-01-01
          相关资源
          最近更新 更多