1 //需求:打印王冠 2 /** 3 System.out.println("* * *"); 4 System.out.println(" *** *** *** "); 5 System.out.println(" ***** ***** ***** "); 6 System.out.println(" ***************** "); 7 System.out.println(" *************** "); 8 System.out.println(" ************* "); 9 10 分析: 11 冠顶: 行数 空格数A *数A 空格数B *数A 空格数B *数A 空格数A 12 1 0 1 10 1 10 1 0 13 2 1 3 6 3 6 3 1 14 3 2 5 2 5 2 5 2 15 line line-1 2*line-1 4*line-2 2*line-1 4*line-2 2*line-1 line-1 16 17 冠底: 行数 空格数C *数B 空格数C 18 4 3 17 3 19 5 4 15 4 20 6 5 13 5 21 7 6 11 6 22 8 7 9 7 23 9 8 7 8 24 10 9 5 9 25 11 10 3 10 26 12 11 1 11 27 line line-1 2*line-1 line-1 28 */ 29 class ForCrown 30 { 31 public static void main(String[] args) 32 { 33 //普通方式打印王冠 34 System.out.println("* * *"); 35 System.out.println(" *** *** *** "); 36 System.out.println(" ***** ***** ***** "); 37 System.out.println(" ***************** "); 38 System.out.println(" *************** "); 39 System.out.println(" ************* "); 40 41 System.out.println("----------------------------------------------------------------------------"); 42 43 //优化方式打印王冠 44 45 int topLine = 5; //打印行数*2(王冠高度) 46 String space = " "; //空格,可改占位符 47 String star = "■"; //星星,可改占位符 48 String jewel = "◇"; //冠顶宝石,可改占位符 49 50 crown(topLine, space, star, jewel); //调用打印冠顶方法 51 } 52 53 /** 54 打印冠顶方法 55 56 @param topLine 打印行数,topLine * 2 = 王冠高度(topLine取值必须大于 1); 57 @param space 空格,可改占位符 58 @param star 星星,可改占位符 59 @param jewel 冠顶宝石,可改占位符 60 */ 61 public static void crown(int topLine, String space, String star, String jewel) 62 { 63 64 if(topLine <= 1) 65 { 66 System.out.println("王冠规格必须大于 1"); 67 return; 68 } 69 int spLine = topLine; //记录 空格数B 打印行数 70 int bottomLine = topLine * 2; //王冠总的行数,冠顶和冠底行数保持一致 71 int count = 0; //累计冠顶最后一行,即冠底的上一行的星星之间的占位数。(冠顶最后一行星星之间的占位数减 2 可得冠底第一行的星星总数) 72 73 //打印冠顶 74 for(int i = 1; i <= topLine; i++) 75 { 76 //空格数A 77 for(int j = 1; j <= i - 1; j++) 78 { 79 System.out.print(space); 80 } 81 //*数A 82 for(int j = 1; j <= 2 * i - 1; j++) 83 { 84 if(i == 1) 85 { 86 System.out.print(jewel); //第一行打印冠顶宝石 87 } 88 else 89 { 90 System.out.print(star); 91 if(i == topLine) 92 { 93 count++; 94 } 95 } 96 } 97 //空格数B 98 for(int j = 4 * spLine - 2; j >= 1; j--) 99 { 100 System.out.print(space); 101 if(i == topLine) 102 { 103 count++; 104 } 105 } 106 //*数A 107 for(int j = 1; j <= 2 * i - 1; j++) 108 { 109 if(i == 1) 110 { 111 System.out.print(jewel); //第一行打印冠顶宝石 112 } 113 else 114 { 115 System.out.print(star); 116 if(i == topLine) 117 { 118 count++; 119 } 120 } 121 } 122 //空格数B 123 for(int j = 4 * spLine - 2; j >= 1; j--) 124 { 125 System.out.print(space); 126 if(i == topLine) 127 { 128 count++; 129 } 130 } 131 spLine--; //输出空格后,spLine自减,以减少 空格数B 下一次循环输出的空格 132 //*数A 133 for(int j = 1; j <= 2 * i - 1; j++) 134 { 135 if(i == 1) 136 { 137 System.out.print(jewel); //第一行打印冠顶宝石 138 } 139 else 140 { 141 System.out.print(star); 142 if(i == topLine) 143 { 144 count++; 145 } 146 } 147 } 148 //空格数A 149 for(int j = 1; j <= i - 1; j++) 150 { 151 System.out.print(space); 152 } 153 System.out.println(); //换行 154 } 155 count -= 2; //累计的是冠顶最后一行的值,冠底第一行使用时,须自减2 156 157 //打印冠底 158 for(int i = topLine + 1; i <= bottomLine; i++) 159 { 160 //空格数C 161 for(int j = 1; j <= i - 1; j++) 162 { 163 System.out.print(space); 164 } 165 //*数B 166 for(int j = count ; j >= 1; j--) 167 { 168 System.out.print(star); 169 } 170 count -= 2; //每打印一行减2 171 //空格数C 172 for(int j = 1; j <= i - 1; j++) 173 { 174 System.out.print(space); 175 } 176 System.out.println(); //换行 177 } 178 } 179 } 180 /* 181 总结:根据普通方式的输出,把王冠拆分冠顶和冠底两部分进行分析,找出空格和组成冠体星星之间的规律。 182 */
打印结果如下图:
原文地址:https://www.cnblogs.com/qq641120784/p/9678506.html
时间: 2024-10-22 11:46:11