最近在回顾基础内容,发现关于for循环打印图形这一块其实有点东西,并且可以的到一个经验与一个总结!
如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。
分析:其实像这种for循环打印特殊图形的问题其实大部分都是数学问题,需要编者自己去找规律;
因为该图形不是单纯的递增或递减,所以可以用四个for循环,两两分开,分别打印上部分和下部分,如下:
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入N:");
int N = scanner.nextInt();
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println("");
}
for (int i = N - 1; i >= 1; i--) {
for (int j = i; j >= 1; j--) {
System.out.print("*");
}
System.out.println("");
}
}
}
但是很明显,用四个for循环太low了,而且时间复杂度空间复杂度有浪费。那我们就改:
public class Home001 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入行数:");
int N = scanner.nextInt();
for (int i = 1; i < 2*N;i++) {
// for (int j = 1; j <= i && j <= 2*N - i; j++) {
// System.out.print("*");
// }
for (int j = 1; j <= N - Math.abs(N-i); j++) {//在这里,N-Math.abs(N-i)的最大值就是N
System.out.print("*"); //不会因为上面2*N的改变而改变。
}
System.out.println("");
}
}
}
针对上面代码的第二层循环注释与非注释部分,非常巧妙。N - Math.abs(N-i) 其实就等于 j <= i && j <= 2*N - i; 因为把绝对值去掉就会变成又边的式子。
如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。
代码如下:
同理:
public class Home002 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入行数:");
int N = scanner.nextInt();
for (int i = 1; i < 2*N; i++) {
// for (int k = 1; k <= Math.abs(N-i) ; k++) {
// System.out.print(" ");
// }
// for (int j = 1; j <= N - Math.abs(N-i); j++) {
// System.out.print("*");
// }
// System.out.println("");
for (int k = 1; k <= N - i || k <= i - N; k++) {
System.out.print(" ");
}
for (int j = 1; j <= i && j <= 2*N - i; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}
如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。
代码如下:
public class Home003 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入行数:");
int N = scanner.nextInt();
for (int i = 1; i < 2*N ; i++) {
for (int j = 1; j <= N - i || j <= i - N; j++) {
System.out.print(" ");
}
System.out.print("*");
for (int k = 1; k <= 2*N-3 - Math.abs(2*N - 2*i); k++) {
System.out.print(" ");
}
if(i>1&&i<2*N-1) {
System.out.print("*");
}
System.out.println("");
}
}
}
如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。
分析:其实这个就只是第二个的变体,直接在 * 旁边空出一个空格就行,代码如下:
public class Home002 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入行数:");
int N = scanner.nextInt();
for (int i = 1; i < 2*N; i++) {
// for (int k = 1; k <= Math.abs(N-i) ; k++) {
// System.out.print(" ");
// }
// for (int j = 1; j <= N - Math.abs(N-i); j++) {
// System.out.print("*");
// }
// System.out.println("");
for (int k = 1; k <= N - i || k <= i - N; k++) {
System.out.print(" ");
}
for (int j = 1; j <= i && j <= 2*N - i; j++) {
System.out.print("* ");
}
System.out.println("");
}
}
}