数学逻辑打印关于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)的最大值就是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("");
			
		}
		
	}
}

总结:其实用※形打印各种对称的图形的关键是数学问题,常说的找规律,并且边缘与内部同时考虑,把边缘部分当成一条线,设法模拟求出该线的方程,在进一步进行求解。同时关于对称很多时候用到绝对值,关键是要找到其特殊点和位置。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值