2016-02-16 242 views
-1

我需要打印完美數字的因子。這是我的主類的要點:從循環打印

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循環對我的目標會更好嗎?還是有其他的方法來打印數字的因素?

+2

一個for循環可能不會太大幫助,因爲它只是另一種循環的緣故。你可以做的是將這些因素收集到一個列表中,然後打印該列表,即遍歷它並在每個元素之前打印一個+,而不是列表中的第一個(或每個元素之後)。 – Thomas

+1

那麼如何使用'List'然後['StringJoiner'](http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html)?或者甚至更好,Java 8流和'collect()'。 – m0skit0

+0

如果你想使用你的代碼:使用2個打印語句並打印+,如果你在之前的一個迭代中打印了一個因子(在方法中使用布爾值來跟蹤它或檢查當前因子不是1這總是第一個)。 – Thomas

回答

6

變化最少的解決,這可能是這樣的:

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始終是一個因素,所以你可以打印循環之前,然後在前面加上+到以後每因素。

+0

爲什麼我沒有想到這一點?謝謝一堆! – Winz

3

您應該將要打印的輸出緩存到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()); 
} 
+0

我建議在'deleteCharAt'之前的'output'上調用'trim'。這一點就是在刪除最後一個字符('+')之前刪除尾部空格。 –

2

由於factor從值1和number % 1 == 0開始將永遠是真實的,你可以打印1,再翻轉factor+System.out.print。像這樣:

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++; 
    } 
} 

不是最好的解決方案,但它會完成這項工作。

2

嘗試創建一個字符串變量和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)); 
1

感謝大家的快速反應。你們都是救命的人,在未來編碼時,我設法挑選了一些新事物來考慮。

無論如何,等待回覆時,我正在擺弄代碼,並提出了一個相當不雅的解決方案,如果有人感興趣的話。這裏的改變主類:

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; 
} 

基本上,我所做的是附加的因素爲一個字符串,然後刪除尾部+使用子串方法的符號。事後看來,我可能應該調用printFactor類中的substring方法。或許像return out.substring(0, out.length()-3);

不過,謝謝大家!

2

只需使用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(" + "))); 
}