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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hacker◊紫猫 中级黑马   /  2014-10-3 23:44  /  1493 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

在 上课时,一次考试中老师出了这么一道题目:/*利用程序输出如下图形:黑马程序员—一道有趣的题目 -
要求打印输出
*
**
***
****
*****
******
*******
******
*****
****
***
**
*
本人当时做了半天做出来一个版本,当然是最笨的那种,我能做出来就很不容易了,以为世界上就这一个答案,我以为就这一种方法,讨论的时候我发现我错了,答案有好几种,通过这件事我明白了,不要轻易认为你的答案是对的,也不要认为你的是最好的,一切皆有可能,要开发思路,吸取经验,多考虑多练习。java的魅力是无穷的。
先说说我的做法,最笨的那种,当然还有最笨的就是只用System.out.println("*")这一种语句打印出来。乳沟真那样我也就不用今黑马了。我的代码思想是;for循环先打印出上半个三角,在for循环打印出下半个循环。代码如下
class Demo3
{
        public static void main(String []args)
        {
                for (int i=0;i<7 ;i++ )                               |for循环打印上半个三角
                {                                                                |
                        for (int j=0;j<i+1 ;j++ )                     |
                        {                                                        |
                                System.out.print("*"+" ");         |                       
                        }                                                        |
                        System.out.println("");                        |
                }
                for (int i=6;i>0 ;i-- )                                |for循环打印下半循环
                {                                                                |
                        for (int j=0;j<i ;j++ )                                |
                        {System.out.print("*"+" ");                |               
                        }                                                        |
                        System.out.println("");                       
                }
        }
}
这个代码用了两个for循环但是我同学用一个for循环就做出来了他的具体思想是见一个for循环
精髓在判断语句中y<=x && y<=14-x这个是关键            
黑马程序员—一道有趣的题目 - cuijianru1990 - cuijianru1990的博客

class TuXing {
      public static void main(String[] args) {

            for (int x=1; x<=13; x++)                         //共13行。

            {

                  for (int y=1; y<=x && y<=14-x; y++) //这句话的意思是y<=x并且y<=14-x上半个三角y<=x起

                  {                                                          //作用下半个三角y<=14-x起作用

                        System.out.print("* ");   

                  }

                  System.out.println();   

           }

      }

}

这并不是最终版本,万万没想到还有第三个方法。这个方法中用到了绝对值,因为Math函数属于java.lang所以不需要掉包。具体如下

class For2 {

    public static void main(String[] args) {

        xunhuan(0);                //调用函数传入值

        xunhuan(7);                 //调用函数传入值

    }

    public static void xunhuan(int n) {                  //定义循环函数

        for(int x=1; x<=7; x++) {

            for(int y=1; y<=Math.abs(n-x); y++) {  //Math.abs()意思为把一个数的绝对值算出来

                System.out.print(" *");

            }

            System.out.println();

        }

    }


}

我并不保证这是唯一的三个写法,也许还有更简单的方法,也许还有比我做的更笨的方法,但一个人的力量是有限的我在黑马写下这篇博客请求跟多的人来谈论方法,也希望给新学习java的同学一些启发。

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
楼主,谢谢分享哦
回复 使用道具 举报
留下,看看
回复 使用道具 举报
不错,:)
回复 使用道具 举报
来个一个for循环的:
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int n = 7;
  6.                 for (int i=0,x=0,j=n-1; x<n*n;i++,x++)
  7.                 {
  8.                         if(i+Math.abs(j)==n){
  9.                                 System.out.println();
  10.                                 i=0;
  11.                                 j--;
  12.                         }
  13.                         System.out.print('*');
  14.                 }
  15.         }
  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

回复 使用道具 举报 1 0
一千个程序员编写一个问题 可能出一千种答案 呵呵  没有最好 之后更好 当然也是没有笨的 只有更笨的 毕竟笨的方法是最容易想到的,如何简化代码 让程序变得简练 就得靠思想和代码量了
回复 使用道具 举报
找到规律就很好弄了。
public class Test1 {

        public static void main(String[] args) {
                tuXing(13);
        }
       
        public static void tuXing(int line/*用来传递行数*/) {
                if(line%2 == 1) {                //对行数进行判定,如果是奇数行,进行如下处理
                        int num = line/2 +1;
                        for(int i = 1; i <= line; i ++) {
                                /*根据规律可以得出,图形上面部分是每行'*'的个数就是其所在的行数,可以通过简单的递增就行;
                                 * 当行数达到要输出行数的一半时,规律发生变化,这时要输出的'*'数其实就是总行数减去所在行数加1,这样在
                                 * 通过循环输出就行了。*/
                                if(i < num) {
                                        for(int j = 0; j < i; j ++) {
                                                System.out.print("*");
                                        }
                                }else {
                                        for(int j = 0; j <= line-i; j ++) {
                                                System.out.print("*");
                                        }
                                }
                                System.out.println();
                        }
                }else {                //对行数进行判定,如果是偶数行,进行如下处理
                        int num = line/2;
                        for(int i = 1; i <= line; i ++) {
                                /*和奇数行时其实类似,不同点就在与当行数为偶数时,他们有单独的中间行,也就是他最中间有两行,
                                 * 所以num行与num+1行都是中间行,判断时,用<=判定*/
                                if(i <= num) {
                                        for(int j = 0; j < i; j ++) {
                                                System.out.print("*");
                                        }
                                }else {
                                        for(int j = 0; j <= line-i; j ++) {
                                                System.out.print("*");
                                        }
                                }
                                System.out.println();
                        }
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马