Java 从循环打印

Java 从循环打印,java,loops,while-loop,numbers,factors,Java,Loops,While Loop,Numbers,Factors,我需要打印一个完美数的因子。以下是我主要课程的要点: 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 (is

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

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();
}
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);
     }
我已经掌握了它的主要要点,但我一直在努力解决输出问题。由于我的在线提交系统的限制,我的输出需要符合确切的规格

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


我不太确定有多少方法可以在while循环中打印。for循环对我的目标更好吗?或者是否有其他方法可以打印数字的因子?

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

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());
}
私有静态无效打印因子(整数)
{
StringBuilder输出=新的StringBuilder();
整数因子=1;
while(系数<数字)
{
如果(数字百分比因子==0)
输出。追加(因子+“+”);
因子++;
}
//删除最后一个加号
output.deleteCharAt(output.length()-1);
//打印整个字符串
System.out.print(output.toString());
}

解决这一问题所需的最少更改可能如下:

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++;
    }
}
      String numb ="";
        while(factor<number){
            if(number%factor == 0) 
                numb= numb + factor+ " + ";
            factor++;
        }
        System.out.print(numb.substring(0, numb.trim().length()-1));
私有静态无效打印因子(整数)
系统输出打印(1);
整数因子=2;

虽然(factor因为
factor
从值1开始,并且
数字%1==0
始终为真,您可以先打印1,然后在
系统输出中翻转
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++;
    }
}
私有静态无效打印因子(整数){
如果(数字>0){
系统输出打印(1);
}
整数因子=2;

while(factor尝试创建一个变量字符串
numb
,并使用
substring
方法如下:

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++;
    }
}
      String numb ="";
        while(factor<number){
            if(number%factor == 0) 
                numb= numb + factor+ " + ";
            factor++;
        }
        System.out.print(numb.substring(0, numb.trim().length()-1));
String numb=”“;

(P>P>谢谢大家的快速反应。你们都是一个救生员,我在未来的代码中设法重新考虑一些新的事情。

无论如何,在等待回复的过程中,如果有人感兴趣,我正在修改代码,并提出了一个相当不雅观的解决方案。下面是对主类的更改:

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();
}
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);
     }
System.out.println(“介于1和“+上限+”之间的完美数字是:”;

for(inti=0;i只是为了使用Java8:)


for循环可能不会有多大帮助,因为它只是另一种循环。您可以做的是将因子收集到一个列表中,然后打印该列表,即在该列表上循环,并在每个元素之前但第一个(或每个元素之后但最后一个)打印A+在列表中。那么使用
列表如何?或者更好,使用Java 8 streams和
collect()
。如果要使用代码,请使用2条print语句,如果在之前的一次迭代中打印了一个因子,请先打印+语句(在方法中使用布尔值跟踪该值,或检查当前因子是否不是1,因为它始终是第一个)除了@m0skit0所说的可能是最好的方法之外,
StringJoiner
只有在您使用java 8时才可用。您可以在循环之前打印
1
,在
2
处启动
factor
,然后打印
“+”
在循环中的每个数字之前。我建议在
删除字符之前调用
output
上的
trim
。重点是在删除最后一个字符(
+
)之前删除尾随空格。为什么我没有想到呢?非常感谢!