[英]pyramid printing using Java
笔记:
public static void main(String[] args) {
int rows = 5, k = 0, count = 0, count1 = 0;
for(int i = 1; i <= rows; ++i) {
for(int space = 1; space <= rows - i; ++space) {
System.out.print(" ");
++count;
}
while(k != 2 * i - 1) {
if (count <= rows - 1) {
System.out.print((i + k) + " ");
++count;
}
else {
++count1;
System.out.print((i + k - 2 * count1) + " ");
}
++k;
}
count1 = count = k = 0;
System.out.println();
}
}
}
在下面找到答案:
public class Main {
static int rows = 10;
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
for(int i = 1 ; i <= rows ; i++){
if(i ==1 ) numbers.add(1);
else {
int totalNumber = i * 2 -1;
insertNumbers(totalNumber, numbers);
}
printNumbers(numbers, i);
System.out.println();
numbers.clear();
}
}
private static void insertNumbers(int totalNumber, LinkedList<Integer> numbers) {
int numbersOnEachSide = (totalNumber - 1) / 2;
for (int i = 0; i < numbersOnEachSide ; i++ ) numbers.add((int) Math.pow(2, i));
numbers.add((int) Math.pow(2,numbersOnEachSide));
for(int i = 0 ; i < numbersOnEachSide ; i++) numbers.add((int) Math.pow(2, numbersOnEachSide-1-i));
}
private static void printNumbers(LinkedList<Integer> numbers, int i) {
int spaceNorows = rows - i;
printSpaces(spaceNorows);
for (Integer number : numbers) {
System.out.print(number + "\t");
}
printSpaces(spaceNorows);
}
private static void printSpaces(int spaceNorows) {
for(int j = 0 ; j< spaceNorows ; j++) System.out.print("\t");
}
}
输出:
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 512 256 128 64 32 16 8 4 2 1
ps 请查看https://stackoverflow.com/tour在以后的帖子中提出正确的问题。
编辑:如何在CMD
运行代码
要运行上面的应用程序:
1- 将上面的所有代码保存在一个名为 - 例如 - Main.java 的文件中
2-运行CMD
在窗户或terminal
在Linux和编译Main.java
使用javac Main.java
。
3- 编译后的文件将放在与java
文件相同的目录中。
4- 使用java Main
运行编译后的类。
将Main
更改为您为文件提供的任何名称
由于您在 cmd 中运行代码,它可能无法正确显示 10 行金字塔(由于屏幕分辨率、大小等)。 因此,更改static int rows = 10;
的行字段static int rows = 10;
到5
以正确查看金字塔。
您可以进一步更改固定行号以从用户那里动态获取它。
我决定尝试一下,主要是因为我想展示一些与解决问题有关的概念。
首先,我将金字塔的高度设为变量。 这迫使我考虑不同的金字塔高度将如何影响每条线的每一段的宽度。
接下来,我决定预先计算两个的幂。 重新计算每一行的值是没有意义的。 所以,我写了一个方法来返回一个预先计算好的整数数组。
接下来,我计算了 2 的最大幂会占用多少空间。 我使用NumberFormat
类格式化了数字。 NumberFormat
类将根据您运行代码的Locale
来格式化数字。 我使用String
类的format
方法给每个数字足够的空间。
接下来,我将每一行划分为一个空白区、一个数字区和一个空白区。 这样,我可以分别处理一行的每个部分。 金字塔线左侧的空白区域与线右侧的空白区域的长度相同,因此我只需为每条线创建一次。
我使用StringBuilder
创建金字塔的每一行。 使用StringBuilder
比连接String
值更快。 我使用StringBuilder
段来创建金字塔线的部分。
我没有使用static
方法,因为我想展示如何在main
方法中实例化类。 一般来说,我尽量避免使用static
方法。
这是一次测试运行的结果。 我向你保证,我对这段代码进行了几十次测试。
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 128 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 256 512 256 128 64 32 16 8 4 2 1
这是代码。
import java.text.NumberFormat;
public class NumberPyramid {
public static void main(String[] args) {
int power = 10;
NumberPyramid np = new NumberPyramid();
np.createPyramid(power);
}
private static final NumberFormat NF =
NumberFormat.getNumberInstance();
public void createPyramid(int power) {
int[] values = createPowersArray(power);
String maximum = NF.format(values[power - 1]);
int segmentSize = maximum.length() + 2;
String format = "%" + segmentSize + "s";
for (int index = 0; index < power; index++) {
StringBuilder builder = new StringBuilder();
StringBuilder blankArea = createBlankArea(
index, power, segmentSize);
builder.append(blankArea);
builder.append(createNumberArea(index, values, format));
builder.append(blankArea);
System.out.println(builder.toString());
}
}
private int[] createPowersArray(int power) {
int[] values = new int[power];
values[0] = 1;
for (int i = 1; i < power; i++) {
values[i] = values[i - 1] * 2;
}
return values;
}
private StringBuilder createNumberArea(int index,
int[] values, String format) {
StringBuilder builder = new StringBuilder();
for (int j = 0; j <= index; j++) {
builder.append(String.format(format,
NF.format(values[j])));
}
for (int j = index - 1; j >= 0; j--) {
builder.append(String.format(format,
NF.format(values[j])));
}
return builder;
}
private StringBuilder createBlankArea(int index,
int power, int segmentSize) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < power - index - 1; i++) {
builder.append(createBlankSegment(segmentSize));
}
return builder;
}
private StringBuilder createBlankSegment(int length) {
StringBuilder builder = new StringBuilder(length);
for (int i = 0; i < length; i++) {
builder.append(" ");
}
return builder;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.