我在Java中完成了这项任务,而且我不知道如何做到这一点。
任务是接收整数n> 1。 0,并打印由*
内部构造的n个帧,而内框将具有字母" X"由4n + 1 *
构成。
我无法使用数组或字符串。
例如: 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("*");
}
}
答案 0 :(得分:2)
这个问题有很多不同的方法。这可能不是最好的,但它是非常简单和有教育意义的IMO。
主要思想是:您不需要知道如何打印整个框架。您只需要知道如何打印1/4 - 然后以反向X顺序重复它,然后以反向Y顺序重复它。让我们从绘制X开始,特别是它的一个对角线。如果“X”必须有4n + 1 *
,则它有4个臂,每个a
个星,中间有一个*
- 总共4 * a
+ 1星 - 显然,4n + 1 == 4a + 1,每只手臂必须有n
*
个。让我们使用XY笛卡尔坐标系。因此,如果x == y,我们只有一个星号 - 否则我们就有空间。
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&amp;&amp; y&lt; = n)? x == y :((x