2014-08-27 7 views
0

최근 자바를 가르쳐 왔고 파스칼의 삼각형을 만들기위한 코드를 만들었습니다. 그러나 삼각형으로 제대로 인쇄 할 수는 없습니다. 여러 자릿수의 계정 번호를 입력하는 방법을 알 수 없습니다. 여기까지 내가 지금까지 가지고있는 것 :자바에서 파스칼 삼각형의 포맷하기

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

나는 완전한 초보자이며 실제적인 지시를 전혀하지 않았습니다. 내가 아는 모든 것은 인터넷에서 나오며 이클립스에서 어지럽 죠.

+0

@Adi 그/그녀는 콘솔 출력의 포맷에 대해 걱정하고 있습니다. –

답변

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 코드가 작동하지 않는 이유를 설명하는 것입니다. –

+0

@ MichałSchielmann tnx –

+0

숫자 사이에 고유 한 공백이 없으므로 코드가 완벽한 삼각형을 만들지 못합니다. –

0

마다 번호가 출력 문자 집합 번호를 사용하며, 각 번호를 출력 할 때 필요한 경우 별도의 공백을 추가에이 법령이다 간단한 일을하는 데 도움이됩니다. 예를 들어, 각 숫자가 4자를 차지하도록 결정할 수 있습니다 (모든 숫자가 9999 이하인 경우 - 실제로 20 개의 행이있는 파스칼의 삼각형을 사용하면 5 자 이상 필요합니다). 그런 다음 삼각형의 각 행에 인쇄 할 공간의 수를 조정해야합니다.

숫자가 "상자"4 문자의 오른쪽에 이상 밀려 4 자리 숫자를 문자열로 변환하려면, 당신은 String.format 필요한 경우 왼쪽, 사용에 공백을 추가

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

당신이 수는 "상자"의 왼쪽에있을하려면,

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

당신이 수는 "상자"에 중심을하려는 경우,이 어렵습니다. 다음 number 경우

System.out.print(center(4, Integer.toString(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(); 
} 

과 : 여기에 패드 공백으로 양쪽에 문자열을, 가능한 한 양쪽에 동일에 가깝게 패딩을 제조하는 방법이다 long, 대신 StringBuilder

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

(PS, 당신은 String을 할 result를 선언 할 수있다 원래 질문에서와 같이 result += " "과 같은 것을 사용하십시오. 그것은 단지 몇 나노초 더 느린 것을 제외하고는 잘 작동 할 것입니다.)

0

그래서 문제는 간격이 있습니다.

숫자 뒤에 하나의 공백이 항상 사용됩니다. 한 숫자는 길이가 1이 될 수 있기 때문에 문제가됩니다 (예 : 1,2,3,4,5,6,7,8,9). 길이가 5 - 즉 31824입니다.이 때문에 삼각형은 오른쪽에서 더 넓습니다. 모든 숫자에 대해 동등한 공간을 예약해야한다는 것을 변경하려면 가장 큰 숫자가 184756 인 경우 인쇄 할 모든 번호에 대해 6 자리 및 1 개의 빈 공간을 예약해야합니다.

또한 초기 간격은 일반적으로 문제를 일으킬 수있는 행 수와 관련이 없습니다 (삼각형을 30보다 크게하려면 - 현재 상수). 먼저이 (1)입니다 :

그래서 나는 변화를 제안 곳 두 곳이있다 여기에 30

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

이 20하는 치수 삼각형 작동 상수이지만, 우아한 아니다 및 더 큰 삼각형에 대해서는 작동하지 않습니다.

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

maxNumberLength이 삼각형의 숫자가 얻을 수있는 최대 길이 : 그래서 나는이 (2) 같은 것을 건의 할 것입니다. 그것을 계산하는 방법? I'have이 같은 추정이 (3) :

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

이 전원은 항상 삼각형에서 가장 큰 값보다 더 큰,하지만 훨씬 의해 될 것입니다. 당신은 다르게 할 수 있습니다 - 그것은 내 마음에 온 첫 번째입니다.

다시 (2) ... numberOfRows는 삼각형의 행 수입니다. i을 빼기 전에 각 행에서 더 작은 초기 공간 maximumNumberLength/2을 얻으십시오 (그래야 왼쪽 기울기가 생깁니다). 당신은 항상 하나의 공간을 추가 할 가장 중요한 부분

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

: 나는 변화를 제안

두 번째 것은 이것이다. 최대 길이 길이가 6 인 경우 1 다음에 6 공백을 추가하고 20 뒤에 5 공백을 추가해야합니다. 에서

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) 먼저 PARAM으로 번호를 가지고 (즉가 될 수있다 : 나는 방법을 작성하시기 바랍니다 그게 전부가 당신이 (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(); 
     } 
    } 
}