2014-08-27 125 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(); 
     } 
    } 
}