gpt4 book ai didi

java - 在 Java 中格式化帕斯卡三角形

转载 作者:行者123 更新时间:2023-12-01 12:36:31 25 4
gpt4 key购买 nike

我最近一直在自学 Java,并编写了一段代码来生成帕斯卡三角形。但是,我无法让它以三角形正确打印出来。我不知道如何考虑多位数字。这是我到目前为止所拥有的:

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 中乱搞。

最佳答案

所以你遇到的问题是间距。

您总是在数字后使用一个空格,这是一个问题,因为一个数字的长度可以为 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是三角形中的数字可以获得的最大长度。如何计算呢?我是这样估计的(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;
}
}

关于java - 在 Java 中格式化帕斯卡三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com