所以你遇到的問題是間距。
您在數字後面總是使用一個空格,這是一個問題,因爲一個數字的長度可能是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;
}
}
@Adi他/她擔心控制檯輸出的格式。 – 2014-08-27 17:04:47