그래서 문제는 간격이 있습니다.
숫자 뒤에 하나의 공백이 항상 사용됩니다. 한 숫자는 길이가 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;
}
}
@Adi 그/그녀는 콘솔 출력의 포맷에 대해 걱정하고 있습니다. –