A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一面

中级黑马

  • 黑马币:12

  • 帖子:31

  • 精华:0

自学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++;
                        }
                }
        }
}

2 个回复

倒序浏览
女神之泪 来自手机 中级黑马 2016-4-18 07:26:51
沙发
顶顶~~
回复 使用道具 举报
顶顶~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马