2014-08-27 123 views
0

我最近一直在教自己的Java和我做了一段代碼來生成帕斯卡的三角形。但是,我無法在三角形中正確打印。我無法弄清楚如何考慮多位數字。這是我到目前爲止:在Java中格式化Pascal三角形

public class Pas{ 
    public static void main(String[] args){ 
    pas(20); 
} 

public static void pas(int rows){ 

    for(int i = 0; i < rows; i++){ 
     String spaces = ""; 
     int counter = (rows + 30)/2 - i; 
     for(int f = counter; f > 0; f --){ 
      spaces += " "; 

     } 

     System.out.print(spaces); 
     for(int j = 0; j <= i; j++){ 
      System.out.print(ncr(i, j) + " "); 
     } 
     System.out.println(); 
    } 
} 

public static long ncr(int n, int r){ 
    return fact(n)/(fact(r) * fact(n - r)); 
} 

public static long fact(int n){ 
    long ans = 1; 
    for(int i = 2; i <= n; i++){ 
     ans *= i; 
    } 
    return ans; 
} 

請記住我是一個完整的初學者,從來沒有任何實際的指示。我所知道的一切都來自互聯網,並在Eclipse中搞亂。

+0

@Adi他/她擔心控制檯輸出的格式。 – 2014-08-27 17:04:47

回答

0

這個代碼將有助於你

int rows = 10; 


for(int i =0;i<rows;i++) { 
    int number = 1; 
    System.out.format("%"+(rows-i)*2+"s",""); 
    for(int j=0;j<=i;j++) { 
     System.out.format("%4d",number); 
     number = number * (i - j)/(j + 1); 

    } 
    System.out.println(); 
} 
+0

這不適用於20,而是關於解決方案,而是解釋爲什麼OP代碼不起作用。 – 2014-08-27 17:36:22

+0

@MichałSchielmanntnx – 2014-08-27 17:38:16

+0

他的代碼沒有做出完美的三角形,因爲數字之間沒有唯一的空格。 – 2014-08-27 17:39:45

0

的就是聖旨,每一個號碼,你的輸出將使用的字符集數,並在必要時輸出每個號碼時添加額外的空格最簡單的事情。例如,您可以決定每個數字需要4個字符(如果所有數字都是9999或更少 - 實際上,使用20行的帕斯卡三角形,您至少需要5個字符)。然後,您需要調整在三角形的每一行中打印出的空格數量。

要將一個數轉換到數字推到了4個字符的「盒子」右側的4個字符的字符串,而你在必要時離開,用String.format添加空格:

String output = String.format("%4d", number); 

如果你想數是在「框」的左側,

String output = String.format("%-4d", number); 

如果你想在「盒子」爲中心的數量,這是更難。下面是將墊兩面帶空格的字符串,從而儘可能接近等於兩邊儘可能填充的方法:

public static String center(int desiredLength, String input) { 
    if (input.length() >= desiredLength) { 
     return input; 
    } 
    int leftPadding = (desiredLength - input.length())/2; 
    int rightPadding = desiredLength - input.length() - leftPadding; 
    StringBuilder result = new StringBuilder(); 
    for (int i = 0; i < leftPadding; i++) { 
     result.append(' '); 
    } 
    result.append(input); 
    for (int i = 0; i < rightPadding; i++) { 
     result.append(' '); 
    } 
    return result.toString(); 
} 

,然後你可以說

System.out.print(center(4, Integer.toString(number))); 

,或者,如果numberlong

System.out.print(center(4, Long.toString(number))); 

(PS相反的StringBuilder,你可以聲明result是一個String一個nd像你原來的問題一樣使用result += " "之類的東西。這可能會工作得很好,除了幾納秒慢)。

0

所以你遇到的問題是間距。

您在數字後面總是使用一個空格,這是一個問題,因爲一個數字的長度可能是1 - 即:1,2,3,4,5,6,7,8,9 - 另一個數字可以是長度爲5--即31824.因爲你的三角形在右側較寬。 要改變這一點,你必須爲所有的號碼保留相同的空間 - 所以如果你最大的號碼是184756,那麼對於你打印的每個號碼,你必須預留6位數和1個空位。

此外,您的初始間距與行數無關,這通常會產生問題(如果您想使三角形大於30,即當前常數)。

因此,有兩個地方我建議改變: 首先是這個(1)

int counter = (rows + 30)/2 - i; 

這裏30是你的20漁政船三角工作恆定,但它不是優雅將不適用於更大的三角形。所以我建議這樣的事情(2)

int counter = (maxNumberLength*(numberOfRows - i))/2; 

maxNumberLength是最大長度在三角形中的數字可以得到的。如何計算它? I'have估計這樣的(3)

Math.pow(2d, numberOfRows.doubleValue()); 

這股力量將永遠是比三角最大的價值更大,但不是很大。你可以做不同的事情 - 這是我想到的第一個。

回到(2)... numberOfRows是三角形中的行數。乘以i後乘以得到每行中較小的初始空間maximumNumberLength/2(以便它具有左斜率)。

,我會建議改變的第二件事情是這樣的:

System.out.print(ncr(i, j) + " "); 

這是最重要的一部分,你總是加1米的空間。如果最大數字長度爲6,則應在1之後加上6個空格,20之後等於5個空格。這就是爲什麼我建議創建一個方法,將返回你所需要(4)的空格數:

private String spaces(final Long number, final int maxNumberLength) 
{ 
    StringBuilder spaces = new StringBuilder(""); 
    for (int i = 0; i<maxNumberLength - number.toString().length(); i++) 
    { 
     spaces.append(" "); 
    } 
    return spaces.toString(); 
} 

(4)你把號碼作爲第一個參數(這也就是要數隨後是空格)和maxNumberLength(3)。這樣,你所有的數字都會在輸出中佔用相同數量的空間。我用StringBuilder構建空間,這對於字符串連接更有效。

這就是它 - 兩個變化,它應該工作。 我附上我的完整的代碼,所以如果你需要,你可以測試一下:

public class TraingleTest 
{ 
    private final BufferedReader input; 
    private Integer numberOfRows; 

    public static void main(String args[]) 
    { 
     BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
     new TraingleTest(input).run(); 
    } 

    private TraingleTest(final BufferedReader input) 
    { 
     this.input = input; 
    } 

    private void run() 
    { 
     boolean validNumber = false; 

     System.out.print("Please enter number of rows for Pascals Triangle: "); 
     do 
     { 
      String usersInput = readUserInput(); 
      validNumber = validateInput(usersInput); 
     } while (!validNumber); 

     makeTriangle(); 
    } 

    private String readUserInput() 
    { 
     try 
     { 
      return input.readLine(); 
     } 
     catch (final IOException e) 
     { 
      System.out.print("Error while reading input. Please try one more time: "); 
      return ""; 
     } 
    } 

    private boolean validateInput(final String input) 
    { 
     try 
     { 
      Integer inputValue = Integer.parseInt(input); 
      if (inputValue > 2 && inputValue < 22) 
      { 
       numberOfRows = inputValue; 
       return true; 
      } 

      System.out.print("Value must be an integer between 3 and 21. Please insert valid number: "); 
      return false; 
     } 
     catch (final Exception e) 
     { 
      System.out.print("Error while parsing input. Please insert valid number: "); 
     } 
     return false; 
    } 

    private void makeTriangle() 
    { 
     int maxNumberLength = Double.valueOf(Math.pow(2d, numberOfRows.doubleValue())).toString().length(); 

     for(int i = 0; i < numberOfRows; i++){ 
      String spaces = ""; 
      int counter = (maxNumberLength*(numberOfRows - i))/2; 
      for(int f = counter; f > 0; f --) 
      { 
       spaces += " "; 
      } 

      System.out.print(spaces); 
      for(int j = 0; j <= i; j++) 
      { 
       long number = ncr(i, j); 
       System.out.print(number + spaces(number, maxNumberLength)); 
      } 
      System.out.println(); 
     } 
    } 

    private String spaces(final Long number, final int maxNumberLength) 
    { 
     StringBuilder spaces = new StringBuilder(""); 
     for (int i = 0; i<maxNumberLength - number.toString().length(); i++) 
     { 
      spaces.append(" "); 
     } 
     return spaces.toString(); 
    } 

    public long ncr(int n, int r) 
    { 
     return fact(n)/(fact(r) * fact(n - r)); 
    } 

    public long fact(int n) 
    { 
     long ans = 1; 
     for(int i = 2; i <= n; i++) 
     { 
      ans *= i; 
     } 
     return ans; 
    } 
} 
1

//我還沒有輸入,您可以把輸入語句和輸入任何行的行

public class PascalTriangle { 
    public static void main(String[] args) { 
     int rows = 10; 
     for(int i = 0; i < rows; i++) { 
      int number = 1; 
      System.out.format("%"+(rows-i)*2+"s",""); 
      for(int j = 0; j <= i; j++) { 
       System.out.format("%4d",number); 
       number = number * (i - j)/(j + 1); 
      } 
      System.out.println(); 
     } 
    } 
}