gpt4 book ai didi

java - 在框架内打印框架

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:26 25 4
gpt4 key购买 nike

我在 Java 中得到了这个作业,但我完全不知道如何去做。任务是接收一个整数 n > 0,并在内部打印由 * 构造的 n 个帧,而内部帧将具有由 4n+1 构造的字母“X” >*。我不能使用数组或字符串。

例如:n=1 将打印:

*******
* *
* * * *
* * *
* * * *
* *
*******

n=2 将打印:

*************
* *
* ********* *
* * * *
* * * * * *
* * * * * *
* * * * *
* * * * * *
* * * * * *
* * * *
* ********* *
* *
*************

这是我目前所拥有的:

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int size = n * 6 + 1;
int x = 1;
int y = 1;

for (int i = 0; i < n; i = i + 1) {
for (int i3 = 0; i3 < size; i3 = i3 + 1) {
System.out.print("*");
}

System.out.println("");
y = y + 1;

for (int i1 = 0; i1 < size - 2; i1 = i1 + 1) {
System.out.print("*");
for (int i2 = 0; i2 < size - 2; i2 = i2 + 1) {
System.out.print(" ");
}

System.out.println("*");
y = y + 1;
}

for (int i4 = 0; i4 < size; i4 = i4 + 1) {
System.out.print("*");
}
}

最佳答案

有许多不同的方法可以解决这个问题。这可能不是最好的,但它非常简单且具有教育意义。

主要思想是:您不需要知道如何打印整个框架。您只需要知道如何打印其中的 1/4 - 然后以相反的 X 顺序重复它,然后以相反的 Y 顺序重复它。让我们从绘制 X 开始,特别是 - 它的一个对角线。如果“X”必须有 4n+1 * , 它有 4 个臂 a星星一颗一颗*在中间 - 总计 4 * a + 1 星 - 所以,很明显,4n+1 == 4a+1,并且每条 ARM 必须正好有 n *的。让我们使用 XY 笛卡尔坐标系。因此,如果 x == y,我们只有一个星号 - 否则我们在那里有 s 个空间。

for ( int y = 0; y < n; y++ ) {
for ( int x = 0; x < n; x++ ) {
System.out.print( ( x == y ) ? '*' : ' ' );
}
System.out.println();
}

现在,让我们也通过反向迭代向它添加一个镜像副本:

for ( int y = 0; y < n; y++ ) {
for ( int x = 0; x < n; x++ ) {
System.out.print( ( x == y ) ? '*' : ' ' );
}
for ( int x = n; x >= 0; x-- ) {
System.out.print( ( x == y ) ? '*' : ' ' );
}
System.out.println();
}

现在,让我们尝试进入有效的笛卡尔:

int x, y;
for ( y = -n; y <= n; y++ ) {
for ( x = -n; x < 0; x++ ) {
System.out.print( ( x == y || x == -y ) ? '*' : ' ' );
}
for ( ; x <= n; x++ ) {
System.out.print( ( x == y || x == -y ) ? '*' : ' ' );
}
System.out.println();
}

最后,我们可以认为它只是

for ( int y = -n; y <= n; y++ ) {
for ( int x = -n; x <= n; x++ ) {
System.out.print( hasAsterisk( Math.abs(x), Math.abs(y) ) ? '*' : ' ' );
}
System.out.println();
}

例如

static boolean hasAsterisk( int x, int y ) {
return x == y;
}

扩展此代码以处理帧,您就大功告成了。框架的每个“夸脱部分”只有 *对于每个 n,总共 2n 个字符 - 十字本身的长度为 n(见上文)加上 1 个中央星号;总而言之,X 和 Y 的范围将超过 int [-3n,3n] - 称之为 3n一些 m并将其作为迭代的范围。

作为附加提示,公式对于内部交叉(即 abs(x)<n,abs(y)<n)是不同的,对于框架本身也是不同的。如果您注意到它是每隔一行,则可以很容易地弄清楚框架的公式,其形状是 X 轴上的两个星号三角形添加到 Y 轴上的两个三角形。

返回 ( x <= n && y <= n ) ? x == y : ( ( x < y ) ? y % 2 == nMod2 : x % 2 == nMod2 );

关于java - 在框架内打印框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818231/

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