我写自己的逻辑来打印pascal三角形。这有以下代码:
import java.util.Scanner;
public class pascal {
public static void main(String[] arg) {
Scanner sc = new Scanner(System.in);
System.out.print("please enter height of pascal triangle :");
int Heightchk = 0, Height = sc.nextInt();
if (Height > 0) {
MYarray PascalArray = new MYarray();
PascalArray.setLength(Height * 2 - 1);
PascalArray.IntilizeA(PascalArray.A);
if (Height == 1) {
PascalArray.printArray(PascalArray.A);
} else {
while (Heightchk < Height) {
PascalArray.printArray(PascalArray.A);
Heightchk += 1;
if (Heightchk < Height) {
PascalArray.reSet(PascalArray.B);
PascalArray.setElements(PascalArray.A, PascalArray.B);
PascalArray.printArray(PascalArray.B);
Heightchk += 1;
if (Heightchk < Height) {
PascalArray.reSet(PascalArray.A);
PascalArray.setElements(PascalArray.B, PascalArray.A);
}
}
}
}
} else {
System.out.println("Can't Draw pascal Triangle of this Height");
}
}
}
class MYarray {
String[] A, B;
void IntilizeA(String[] Array) {
Array[(Array.length - 1) / 2] = "1";
}
void setLength(int length) {
A = new String[length];
B = new String[length];
for (int i = 0; i < A.length; i++) {
A[i] = "\t";
B[i] = "\t";
}
}
void reSet(String[] Array) {
for (int i = 0; i < Array.length; i++) {
Array[i] = "\t";
}
}
void printArray(String[] Array) {
for (String Element : Array) {
System.out.print(Element);
}
System.out.println();
System.out.println();
System.out.println();
}
void setElements(String[] from, String[] to) {
for (int i = 0; i < from.length; i++) {
if (from[i] != "\t") {
if (to[i - 1] == "\t") {
to[i - 1] = "0";
}
if (to[i + 1] == "\t") {
to[i + 1] = "0";
}
to[i - 1] = String.valueOf(Integer.valueOf(to[i - 1]) + Integer.valueOf(from[i]));
to[i + 1] = String.valueOf(Integer.valueOf(to[i + 1]) + Integer.valueOf(from[i]));
}
}
}
}
我应用的超级精细的逻辑,但仍然存在元素对齐的问题。 它给出了以下输出:
please enter height of pascal triangle :5
1
1 1
1 2 1
1 3 3 1
虽然它的输出应该是这样的:
please enter height of pascal triangle :5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
我的逻辑有什么问题。我怎么能做对的?
答案 0 :(得分:1)
你的代码绝对没问题。但是当您用任何数字替换选项卡\t
时,您最终会删除该数组的那么多缩进。
例如,在您的第一个数组中 1是作为中心元素的第4个元素。这意味着它在Array的中心之前有4个选项卡。
在第二个数组中,在中心索引之前,您已将一个选项卡替换为1,因此第二个数组的缩进最终将数组的中心向左移动,带有1个选项卡。
下一个阵列会继续。所以你的格式错了。要处理此问题,请不要使用数字替换制表符,而是将数字附加到\t
。这将确保您的缩进完好无损。
以下是更新的代码。我还更新了您的代码以遵循标准命名约定
import java.util.Scanner;
public class Pascal {
public static void main(String[] arg) {
Scanner sc = new Scanner(System.in);
System.out.print("plese enter height of pascal tringle :");
int heightchk = 0, height = sc.nextInt();
if (height > 0) {
MyArray pascalArray = new MyArray();
pascalArray.setLength(height * 2 - 1);
pascalArray.IntilizeA(pascalArray.a);
if (height == 1) {
pascalArray.printArray(pascalArray.a);
} else {
while (heightchk < height) {
pascalArray.printArray(pascalArray.a);
heightchk += 1;
if (heightchk < height) {
pascalArray.reSet(pascalArray.b);
pascalArray.setElements(pascalArray.a, pascalArray.b);
pascalArray.printArray(pascalArray.b);
heightchk += 1;
if (heightchk < height) {
pascalArray.reSet(pascalArray.a);
pascalArray.setElements(pascalArray.b, pascalArray.a);
}
}
}
}
} else {
System.out.println("Can't Drow pascal Tringle of this Height");
}
sc.close();
}
}
class MyArray {
String[] a, b;
void IntilizeA(String[] array) {
array[(array.length - 1) / 2] = "\t1";
}
void setLength(int length) {
a = new String[length];
b = new String[length];
for (int i = 0; i < a.length; i++) {
a[i] = "\t";
b[i] = "\t";
}
}
void reSet(String[] array) {
for (int i = 0; i < array.length; i++) {
array[i] = "\t";
}
}
void printArray(String[] array) {
for (String element : array) {
System.out.print(element);
}
System.out.println();
}
void setElements(String[] from, String[] to) {
for (int i = 0; i < from.length; i++) {
if (from[i] != "\t") {
if (to[i - 1] == "\t") {
to[i - 1] = "0";
}
if (to[i + 1] == "\t") {
to[i + 1] = "0";
}
to[i - 1] = "\t"+String.valueOf(Integer.valueOf(to[i - 1].trim()) + Integer.valueOf(from[i].trim()));
to[i + 1] = "\t"+String.valueOf(Integer.valueOf(to[i + 1].trim()) + Integer.valueOf(from[i].trim()));
}
}
}
}
输出
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
答案 1 :(得分:0)
由于你知道高度,你可以推断出最后一行的宽度。其中一半是中间,这是第一行应该水平开始的地方。对于每个额外的行,在中间之前再开始几个空格。