本文主要是介绍数学逻辑打印关于for循环打印特殊图形《Blind-Stab》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在回顾基础内容,发现关于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)的最大值就是NSystem.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("");}}
}
总结:其实用※形打印各种对称的图形的关键是数学问题,常说的找规律,并且边缘与内部同时考虑,把边缘部分当成一条线,设法模拟求出该线的方程,在进一步进行求解。同时关于对称很多时候用到绝对值,关键是要找到其特殊点和位置。
这篇关于数学逻辑打印关于for循环打印特殊图形《Blind-Stab》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!