java-打印空心的菱形

  • Post author:
  • Post category:java


代码

/*
空心菱形 层数只能取奇数
*/
public class HollowDiamond {
	/*
		
			   *
			  * *
			 *   *
			*******

		思路分析
		化繁为简
		1. 先打印一个矩形
		*****
		*****
		*****
		*****
		*****
		2. 打印半个金字塔

		*    	//第1层 有 1个*
		**   	//第2层 有 2个*
		***		//第3层 有 3个*
		****    //第4层 有 4个*
		*****   //第5层 有 5个*
		3. 打印整个金字塔

		*       //第1层 有 1个*   2 * 1 -1   有4=(总层数-1)个空格
	   ***      //第2层 有 3个*   2 * 2 -1   有3=(总层数-2)个空格
	  *****     //第3层 有 5个*   2 * 3 -1   有2=(总层数-3)个空格
	 *******    //第4层 有 7个*   2 * 4 -1   有1=(总层数-4)个空格
	*********   //第5层 有 9个*   2 * 5 -1   有0=(总层数-5)个空格
		4. 打印整个菱形

		*       //第1层 有 1个*   2 * 1 -1         有3=(总层数/2+1-1)个空格
	   ***      //第2层 有 3个*   2 * 2 -1         有2=(总层数/2+1-2)个空格
	  *****     //第3层 有 5个*   2 * 3 -1         有1=(总层数/2+1-3)个空格
	 *******    //第4层 有 7个*   2 * 4 -1         有0=(总层数/2+1-4)个空格
	  *****     //第5层 有 5个*   2 * (5/2-1) -1   有1=(5-总层数/2+1)个空格
       ***      //第6层 有 3个*   2 * (6/2-1) -1   有2=(6-总层数/2+1)个空格
	    *       //第7层 有 1个*   2 * (7/2-1) -1   有3=(7-总层数/2+1)个空格
		5. 打印空心菱形 

	    *       //第1层 有 1个*   当前行的第一个位置是*,最后一个位置也是*
	   * *      //第2层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
	  *   *     //第3层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
	 *     *    //第4层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
	  *   *     //第5层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
	   * *      //第6层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
	    *       //第7层 有 1个*   当前行的第一个位置是*,最后一个位置也是*

	*/
	public static void main(String[] args) {
		// 定义菱形层数,层数只能取奇数,偶数层是没有菱形的
		int num = 5;
		for (int i = 1; i <= num; i++) {
			//控制打印上半部分菱形每层的*个数
			if (i <= num / 2 + 1) {
				//在输出*之前,还有输出 对应空格 = 中间层-当前层
				for (int h = 1; h <= num / 2 + 1 - i; h++) {
					System.out.print(" ");
				}
				for (int j = 1; j <= 2 * i - 1; j++) {
					//当前行的第一个位置是*,最后一个位置也是*
					if (j == 1 || j == 2 * i - 1) {
						System.out.print("*");
					} else {
						System.out.print(" ");
					}
				}
			} 
			//控制打印下半部分菱形每层的*个数
			else {
				//在输出*之前,还有输出 对应空格 = 当前层-中间层
				for (int s = 1; s <= i - (num / 2 + 1); s++) {
					System.out.print(" ");
				}
				for (int k = 1; k <= (2 * (num / 2 + 1) - i) * 2 - 1; k++) {
					//当前行的第一个位置是*,最后一个位置也是*
					if (k == 1 || k == (2 * (num / 2 + 1) - i) * 2 - 1) {
						System.out.print("*");
					} else {
						System.out.print(" ");
					}
				}
			}
			// 每打印完一层的*后,就换行 println本身会换行
			System.out.println("");
		}
	}
}

附上效果图:



版权声明:本文为dcyjzsj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。