黑马程序员技术交流社区
标题:
键盘录入并打印正反三角形的问题,请大神看看能否简化
[打印本页]
作者:
一面
时间:
2016-4-18 00:45
标题:
键盘录入并打印正反三角形的问题,请大神看看能否简化
自学javaSE到一半,在某网站看到这样的题目,做出来感觉代码好像太长了。
请大神看看是否可以用简单的代码重新做出来。
另外若不重写的话,下面一长串?的部分感觉太复杂,只改动那部分有没有什么好方案?
先谢谢各位大神
/*
* 需求:打印正反两个三角形,中间三行省略。如下
* ***************
* *************
* ***********
* *********
* *******
* *******
* *********
* ***********
* *************
* ***************
* 要求:键盘录入第一行星星数
*/
import java.util.Scanner;
public class DaYin {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一行星星数:");
int a = sc.nextInt();
daYinFangFa(a);
}
public static void daYinFangFa(int a){
//创建Stringbuilder对象用于字符串拼接
StringBuilder sb = new StringBuilder();
//把空格赋值给kong
String kong = " ";
//把星星赋值给xing
String xing = "*";
//定义变量s,用于for循环
int s = 0;
//定义 ci 用于记录每个三角形的行数,初始化0
int ci = 0;
//使用循环计算每个三角形的行数,用 ci 记录
//因为三角形每行减两个*,可知省略的三行*数量只有两种情况:6,4,2和5,3,1。所以每个三角形*数最少的那行应该>6
//a为第一行*数量,减去2*ci,就是每行*数。第一行ci初始为0,a-0=a 依次类推
while(a - (2 * ci) > 6){
//如果星星数>6,次数+1
ci++;
}
//使用for循环遍历每一行。ci是每个三角形的行数,两个三角形行数就是ci*2
for(int hang = 0;hang < ci * 2;hang++){
//用if判断是上面的三角形还是下面的三角形
if(hang < ci){
//使用for拼接空格。
for(int k = 0;k < hang;k++){
sb.append(kong);
}
//使用for拼接*。
for(int x = 0;x < a - hang * 2;x++){
sb.append(xing);
}
System.out.println(sb);
//清空字符串
sb.delete(0,sb.length());
}else{
//下面三角形拼接空格。
for(int k = 0;k < ci - 1 - s;k++){
sb.append(kong);
}
//拼接*。
//这里的a - (ci * 2) + 2 + (s * 2) 意思是:
//a - (ci * 2) 第一行*数a,减去两个三角形总行数(ci*2),就等于省略的最多*那一行的*数量(结果是6或者5)。
// + 2 就是下面三角形第一行的*数量。
// + (s * 2) 表示每行增加的*数
//太复杂。有没有改进方法????????????????????????????????????????????
for(int x = 0;x < a - (ci * 2) + 2 + (s * 2);x++){
sb.append(xing);
}
System.out.println(sb);
//清空字符串
sb.delete(0,sb.length());
s++;
}
}
}
}
作者:
女神之泪
时间:
2016-4-18 07:26
顶顶~~
作者:
一面
时间:
2016-4-19 15:53
顶顶~~~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2