62,620
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) {
// 起始数, 最大数
int a1 = 3, an = 9, max_line = 30; // 指定输出max_line行
// 每一层的数量是一个等差数列1, 3, 5, 7, 9...所以这里直接算出个数
int len = (a1 + an) * (an - a1) / 2 + a1, _len = len >> 1, line = 0;
for (int c = a1, i = 0; ; ) {
// 行尾
if (c == i) {
c = (len > _len) ? c + 2 : c - 2;
i = 0;
// 在行尾判断是否已经到输入的行数了
if (line >= max_line)
break;
}
// 行初补空格
if (i++ == 0) {
int column;
line++; // 行初修改行记录
// 以下的判断是否需要在行首补空格, 最长的行是不需要补空格的
if ((column = (an - c) >> 1) > 0)
System.out.printf((line > 1 ? "\n%" : "%") + column + 'c', ' ');
else System.out.println();
}
System.out.printf("%c", '*');
// 一堆完结之后再重新开始
if (--len < a1) len = _len << 1;
}
}public static void main(String[] args) {
// 起始数是1, 中间数是9
int a0 = 1, an = 9, max_line = 30;
// 每一层的数量是一个等差数列1, 3, 5, 7, 9...所以这里直接算出个数
int len = (((((a0 + an) >> 1) * ((a0 + an) >> 1))) << 1) - an, _len = len >> 1, line = 0;
for (int c = a0, s = c, i = 0; ; ) {
// 行尾
if (c == i) {
c = (len > _len) ? c + 2 : c - 2;
s = (c + 1) >> 1;
i = 0;
// 在行尾判断是否已经到输入的行数了
if (line >= max_line)
break;
}
// 行初补空格
if (i++ == 0) {
int column;
line++; // 行初修改行记录
// 以下的判断是否需要在行首补空格, 最长的行是不需要补空格的
if ((column = ((a0 + an) >> 1) - s) > 0) {
if (line > 1) System.out.print('\n');
for (int j = 0; j < column; j++)
System.out.print(' ');
}
else System.out.println();
}
System.out.printf("%c", '*');
s++;
// 一堆完结之后再重新开始
if (--len <= 0)
len = _len << 1;
}
}
注释上面都有, 当然一个for也是可以完成任务的, 只需要将
if ((column = ((a0 + an) >> 1) - s) > 0) {
//System.out.printf((line > 1 ? "\n%" : "%") + column + 'c', ' ');
if (line > 1) System.out.print('\n');
for (int j = 0; j < column; j++)
System.out.print(' ');
}改为
if ((column = ((a0 + an) >> 1) - s) > 0) {
System.out.printf((line > 1 ? "\n%" : "%") + column + 'c', ' ');
}输出多个空格可以直接使用System.out.printf("%4c", ' ');这样就会输出4个空格