本帖最后由 u010062569 于 2013-06-18 01:02:28 编辑

解决方案 »

  1.   

    private int len=7;
    public void printRhombus(){
    if(len%2==0) --len;
    for (int i =len/2; i >=-len/2; i--) {
    System.out.print(repeatStr(" ", Math.abs(i)));
    System.out.print(repeatStr("*", len-Math.abs(i)*2));
    System.out.println(repeatStr(" ", Math.abs(i)));
    }
    }
    public String repeatStr(String str,int repeatCount){
    if(str==null || str.length()==0 || repeatCount<=0) return "";
    StringBuffer buf=new StringBuffer();
    for (int i = 0; i < repeatCount; i++)  buf.append(str);
    return buf.toString();
    }
      

  2.   


        for(int i=0, size=4; i<size; i++) {
          
          for(int j=-size; j<=size; j++)
            System.out.print(i+j<0 || i-j<0 ? " " : "*");
          
          System.out.println();
        }
      

  3.   

    System.out.print("   *   ");
    System.out.print("  ***  ");
    System.out.print(" ***** ");
    System.out.print("*******");
      

  4.   


    // 输出几行
    int count = 10;
    for (int i = 0; i < count; i++) {
    // 输出前导空格
    for (int j = 0; j < count - i - 1; j++) {
    System.out.print(" ");
    }
    // 输出几个星号
    for (int j = 0; j < i * 2 + 1; j++) {
    System.out.print("*");
    }
    // 换行
    System.out.println();
    }
      

  5.   

    行号    : i = 0 到 3
    前导空格: 3-i
    星号个数: i*2 + 1 
      

  6.   

    不是我自己想出来的,跟别人学的:http://misakamm.com/blog/14#more-14
      

  7.   

    这个打印有很多解法,只要看清其中规律。
    1、这类打印,都行列打印,你就想象成解析几何里的x,y坐标。左上角是(0,0)
    2、先遍历行,行内遍历列。
    3、看清楚图像的规律。我看这个图的规律
    1、基本是一个4行7列的一个矩形里面分割的
    2、为了节约CPU时间,发现每行只要处理到 4+行数  列即可  (一个梯形)
    于是我们得到如下算法:public class PrintAngle 
    {
    public static void main(String[] args) 
    {
    for (int i =0; i<4 ;i++ )
    {
    for (int j=0; j<(4+i) ;j++)
    {
    System.out.print("* ");
    }
    System.out.println();
    } System.out.println("Hello World!");
    }
    }
    这样打印出来就是
    ****
    *****
    ******
    *******我们去掉右边的空缺,3、我们再来研究坐标的空缺的规律
    我们用x表示行, y表示列,我们总结出打印空格的列的规律
    x    y 
    0   (0-3)
    1   (0-2)
    2   (0-1)
    3   (0-0)看清了么?
    说明满足
    y<3-x  的列打印的是空格(一般就是要找出行列关系的函数、不等式表达式),否则就打印*于是我们继续强化程序得到如下代码,就得出最终结论。
    public class PrintAngle 
    {
    public static void main(String[] args) 
    {
    for (int i =0; i<4 ;i++ )
    {
    for (int j=0; j<(4+i) ;j++)
    {
    if (j<(3-i))
    {
    System.out.print(" ");
    }
    else
    {
    System.out.print("*");
    }
    }
    System.out.println();
    } System.out.println("Hello World!");
    }
    }分析结束。当然,还可以通过别的规律来得出x,y函数表达式。效率不同罢了
    然后,我们进一步挖掘规律,
    那个4,和3,我们看的不太舒服,因为它限定了我们的循环次数
    我们再强化一点。让其可以打印任意行的三角形。
    我们发现表达式中。
    行循环次数rows,需要制定。列数是由行产生的 (y<rows-x),打印空格的列要满足 y<(rows-1-x)表达式
    于是我们再强化一点public class PrintAngle 
    {
    public static void main(String[] args) 
    {
    final int rows = 7;
    //为了节约CPU时间,将这个常量单独拿出来。免得每次都要计算。
    final int cols = rows-1; for (int i =0; i<rows ;i++ )
    {
    for (int j=0; j<(rows+i) ;j++)
    {
    if (j<(cols-i))
    {
    System.out.print(" ");
    }
    else
    {
    System.out.print("*");
    }
    }
    System.out.println();
    } System.out.println("Hello World!");
    }
    }
      

  8.   

    不是我自己想出来的,跟别人学的:http://misakamm.com/blog/14#more-14
    感谢分享!!!
      

  9.   

    不是我自己想出来的,跟别人学的:http://misakamm.com/blog/14#more-14
    感谢分享!!!
    这个只是简化几个if而已...外层循环思想都一样的.
      

  10.   


    public class Test01 {
    public static void main(String[] args) {
    for(int i=1;i<=7;i++){
    for(int j=1;j<=i;j++){
    if(i%2==1){
    System.out.print("*");
    }else{
    System.out.print("");
    }
    }
    if(i%2==1){
    System.out.println();
    }

    }
    }
    }
      

  11.   

    不是我自己想出来的,跟别人学的:http://misakamm.com/blog/14#more-14
    感谢分享!!!
    这个只是简化几个if而已...外层循环思想都一样的.
    亲,我说的是代码中的数轴的思想
      

  12.   

    这个主要要用两重循环来写,打印出的矩阵是由*和空格组成的,矩阵的行和列之间的关系如下所示:
    每一行都有奇数个符号组成,打印的行数为:每行的符号数加1,然后取对半。
    符号之间的规律是:打印*号的区间为从 列数/2-行数 到 列数/2+行数;剩余部分用空格填充代码如下:  void printMatrix(int n){
        if(n%2==0){
          System.out.println("please reset parameter");
        }else{
          for(int i=0;i<(n+1);i++){
             for(int j=0;j<n;j++){
               if(j<(n/2-i)||j>(n/2+i)){
                 System.out.printf(" ");
               }else{
                 System.out.printf("*");
               }
             }
             System.out.println();//换行
          }
        }
      }
      

  13.   

    我就觉得连续几个system.out.println()语句是最快的方法
      

  14.   

    这类程序,核心是算法,算法核心就是数学。顺手贡献个另类的:    public static void main(String[] args) {
            String line = "         *********"; // 奇数个空格,奇数个星
            for (int i = 0; i <= line.length() / 4; i++) {
                int a = line.length() / 4 + i + 1;
                System.out.println(line.substring(a, 2 * a));
            }
        }
      

  15.   


    public class Test{
    public static void main(String[] args) {
    for(int i=1;i<=7;i++){
    for(int j=1;j<=i;j++){
    if(i%2==1){
    System.out.print("*");
    }else{
    System.out.print("");
    }
    }
    if(i%2==1){
    System.out.println();
    }

    }
    }
    }
      

  16.   

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    int row=4;
    for(int i=0;i<row;i++){
    for(int j=0;j<row-(i+1);j++){
    System.out.print(" ");
    }
    for(int b=0;b<(2*(i+1)-1);b++){
    System.out.print("*");
    }
    System.out.println();
    }
    }
      

  17.   

    printf("   *   "/n);
    printf("  ***  "/n);
    printf(" ***** "/n);
    printf("*******"/n);
      

  18.   

    我也来一个,单循环的
    public class Hello {
    public static void main(String[] args) {
    int n = 10;
    char[] array = new char[n * 2 * n];
    for (int j = 1; j <= array.length; j++) {
    array[j - 1] = j % (2 * n) > n - j/(2 * n)
    && j % (2 * n) < (2 * n) - n + j / (2 * n) ? '*'
    : j % (2 * n) == 0 ? '\n' : ' ';
    }
    System.out.println(array);
    }
    }
      

  19.   

    public static void show(int level, int count) {
    for (int i = 1; i < level; i++) {
    System.out.print(" ");
    }
    for (int i = 0; i < count && level >= 1; i++) {
    System.out.print("*");
    }
    if (level >= 1) {
    System.out.println();
    show(level - 1, count + 2);
    }
    } public static void main(String[] args) {
    show(10, 1);
    }用递归写就行了罢。
      

  20.   

                        for (int i = 4; i > 0; i--) {
    for (int j = 0; j < i; j++) {
    System.out.print(" "); } for (int j = 0; j < 9 - i * 2; j++) {
    System.out.print("*");
    } System.out.println();
    }
      

  21.   

    楼上的基本能解决楼主的困惑了!
    当年初学c语言的时候和楼主一样对for循环的二维打印不知所措,甚至觉得自己不是编程的料。最后坚持下来,这一路走来觉得不要去想着自己到底行不行,用心去做就行了
      

  22.   

    public static void main(String[] args) {
    for(int i=1;i<=4;i++){
    for(int j=1;j<=4-i;j++){
    System.out.print(" ");
    }
    for(int z=1;z<=2*i-1;z++){
    System.out.print("*");
    }
    System.out.println("\n");
    } }
      

  23.   


    public class Test01 {
        public static void main(String[] args) {
      
                 printMatrix(21);
                }
    static  void printMatrix(int n){
        if(n%2==0){
          System.out.println("please reset parameter");
        }else{
          for(int i=0;i<(n+1)/2;i++){
             for(int j=0;j<n;j++){
               if((j<(n/2-i)||j>(n/2+i))){
                 System.out.printf(" ");
               }else{
                 System.out.printf("*");
               }
       
             }         System.out.println();//换行
     }    for (int i=n/2-1; i>=0; i--)
       {
       for (int j=0; j<n; j++)
       {
       if (j<n/2-i||j>n/2+i)
       {
       System.out.printf(" ");
       }else{
    System.out.printf("*");
       }
       }
       System.out.println();
       }
    }
      }
    }大神 我给你代码扩展一下 打印菱形 你看看是不是这样写的 
    我本来想在第一个for里面就加进去 没思路 然后就在下面再写了一个for
      

  24.   

    这种思想是基于什么?刚学C语言时都写过了,换成java也是一个样的
      

  25.   

    来个一句话的
    System.out.print("   *\n  ***\n *****\n*******");
      

  26.   

    给你个通俗点的吧
    for(int i=1;i<=4;i++)
    {
    for(int j = 4-i;j>0;j--)
    System.out.print(" ");
    for(int k = 2*i-1;k>0;k-- )
    System.out.print("*");
    System.out.println(); }
      

  27.   


    public class Main {
    public static void main(String[] args) {
    printStar(1,9);
    }

    //3 4
    public static void printStar(int firstRowCount,int rowNum){
    String star = "*";
    int lastRowCount = firstRowCount+2*(rowNum-1);
    int maxSpace = Math.round((float)lastRowCount/2f);
    int space;
    int i = 0;
    int count = firstRowCount;
    int j;
    for(;i<rowNum;i++){
    j = 0;
    space = maxSpace-Math.round((float)count/2f);
    for(;j<space;j++){
    System.out.print(" ");
    }
    j = 0;
    for(;j<count;j++){
    System.out.print(star);
    }
    System.out.println(count);
    count+=2;
    }
    }
    }给你一个万能的方法   这个方法第一个参数指的是第一行有多少颗星星  第二个参数是一共有多少行
      

  28.   

    如果是打印菱形,要进行划分情形,划分成为两部分:第一部分为*逐渐增加到最大的部分,第二部分为*逐渐减少的部分。首先打印的行数和列数存在的规律是行数和列数都是奇数,打印的*号本行与上一行之间的步长差距为偶数。与原先的金字塔相比,第二部分的变化规律是相反的。代码如下:void printMatrix(int row,int col,int step){
      if((row%2==0)||(col%2==0)||(step%2==1)){
         System.out.println("please reset parameter!")
      }else{
         for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(i<row/2&&(j<(row/2-step/2*i)||j>(row/2+step/2*i))){//找到上部分的空白区
                    System.out.print(" ");
                 }else if(i>=row/2&&(j<(step/2*(i-row/2))||j>(row-step/2*(i-row/2)))){//找到下部分的空白区
                   System.out.print(" ");
                }else{
                   System.out.print("*");
                }
            }
            System.out.println();
         }
      }
    }
      

  29.   

    void printMatrix(int row,int col,int step){
      if((row%2==0)||(col%2==0)||(step%2==1)){
         System.out.println("please reset parameter!")
      }else{
         for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(i<row/2&&(j<(col/2-step/2*i)||j>(col/2+step/2*i))){//找到上部分的空白区
                    System.out.print(" ");
                 }else if(i>=row/2&&(j<(step/2*(i-col/2))||j>(col-step/2*(i-col/2)))){//找到下部分的空白区
                   System.out.print(" ");
                }else{
                   System.out.print("*");
                }
            }
            System.out.println();
         }
      }
    }上面的回复有问题,这是修改过的
      

  30.   

     public static void main(String[] args) {
         int c=7;
         int r=(c+1)/2;
         int midle=c/2;
         int j=1;
    int left=midle-j;
    int right=midle+j;
         for(int i=0;i<c*r;i++){
         int index=i%c;
         if(i!=0&&index==0){System.out.println();j++;left=midle-j;right=midle+j;}
         if(left<index&&index<right) System.out.print("*");
         else System.out.print(" ");
         }    }
      

  31.   

     public static void printStar(int line){
            int maxNum = 2*(line-1)+1;
            for(int i=0; i < line; i++){
                int curStarNum = 2*i+1;
                int curBlankNum =  (maxNum-curStarNum)/2;
                int totalNum = curBlankNum+curStarNum;
                StringBuffer buffer = new StringBuffer(totalNum);
                for(int j =0; j < totalNum; j++){
                    if(j < curBlankNum){
                        buffer.append(" ");
                    }
                    else{
                        buffer.append("*");
                    }
                }
                System.out.println(buffer.toString());
            }
            
        }
      

  32.   


    int n = 4; //行数
    for(int i = 1; i <= n; i++){
    for(int j = 1; j <= 2*n-1; j++){
    System.out.print(j >= (n-i) + 1 && j<= (n+i) -1 ? "*" : " ");
    }
    System.out.println();
    }