4

CS学生在这里。我刚刚收到关于循环的介绍,但我不确定我是否非常了解它们。我正在尝试打印一个三角形的 numbers n,这样如果n = 4你会得到这样的东西:

         4
      3  7
   2  6  9
1  5  8 10

相反,我正在结束类似的事情:

   4
3   5

我只想说我迷路了。这是我的代码:

void drawT3 (int n)
{
    int k = 1;
    int t = 1;
    for (int i=1;i<=n;i++)
    {  
        k = n;
        int j;
        for (j=1;j<=n-i;j++)
            System.out.print(" ");

        for (j=1;j<=t;j++)
        {
            System.out.printf("%3d",k);
            k += (n - j);
        }
        n--;
        t++;
        System.out.println();
    }
}
4

4 回答 4

2
void printTriangle(int n)
{ 
    // build an auxiliary 2D array
    final int t[][] = new int[n][n];
    int i = 1;
    for (int s = n - 1; s <= 2 * (n - 1); s++)
    {
        for (int x = s - n + 1; x < n; x++)
        {
            t[x][s - x] = i++;
        }
    }
    // print the array
    for (int y = 0; y < n; y++)
    {
        for (int x = 0; x < n; x++)
        {
            if (t[x][y] > 0)
            {
                System.out.printf("%3d", t[x][y]);
            }
            else
            {
                System.out.printf("   ");
            }
        }
        System.out.println(); // start new line
    }
}
  1. 构建一个大小为 的辅助二维数组n
  2. 像人类一样将数字放入数组中,从 1 到 n,沿着对角线。s代码中代表x + y总和。对于每个对角线,该总和都是恒定的。在第一个对角线(最长的一个)中,总和等于n - 1。在第二个对角线和是 1 更多,n。在最后一个“对角线”(右下角)中,总和为2 * (n - 1)。这正是我们的循环:for (int s = n - 1; s <= 2 * (n - 1); s++). 有了总和,x我们可以y通过简单的减法得到y = s - x
  3. 打印数组。数组的每个单元格都用 0 (int的默认值)初始化。因此,如果一个单元格为零,我们只需打印 3 个空格,以保持三角形的形状。

PS。我的代码是为“教育目的”而编写的 :) 以简单的方式展示它是如何完成的。它没有针对速度和内存进行优化。

于 2013-10-21T18:51:35.973 回答
1

观察上面有很多方法可以打印出三角形的数字,例如,这里有两种,

// for n=5,
// 1  2  3  4  5
//    6  7  8  9
//      10 11 12
//         13 14
//            15

//             5
//          4  9
//       3  8 12
//    2  7 11 14
// 1  6 10 13 15

而且由于递归很有趣!

class triangle
{
    //Use recursion,
    static int rowUR( int count, int start, int depth )
    {
        int ndx;
        if(count<=0) return start;
        //-depth?
        for (ndx=0;ndx<depth;ndx++)
        {
            System.out.print("   ");
        }
        //how many? 5-depth, 5,4,3,2,1
        for( ndx=0; ndx<count; ++ndx )
        {
            System.out.printf("%3d",start+ndx);
        }
        System.out.printf("\n");
        if( count>0 )
        {
            rowUR( count-1, ndx+start, depth+1 );
        }
        return ndx;
    }
    //Use recursion,
    static int rowLR( int count, int start, int depth )
    {
        int ndx, accum;
        if( start < count )
            rowLR( count, start+1, depth+1 );
        for( ndx=0; ndx<depth; ++ndx )
        {
            System.out.print("   ");
        }
        accum=start;
        //how many? 5-depth, 1,2,3,4,5
        for( ndx=0; ndx<(count-depth); ++ndx )
        {
            System.out.printf("%3d",accum);
            accum+=count-ndx;
        }
        System.out.printf("\n");
        return ndx;
    }
    public static void main(String[] args)
    {
        int count=4, depth=0, start=1;
        System.out.printf("rowUR\n");
        rowUR( count=5, start=1, depth=0 );
        System.out.printf("rowLL\n");
        rowLL( count=5, start=1, depth=0 );
    }
};
于 2013-10-21T23:44:05.397 回答
1
int n=4,i,j,k,t;
for (i=n;i>=1;i--)
{  
    t=i;
    k=n;
    for(j=1;j<i;j++)
        System.out.printf("   ");  // for leading spaces

    System.out.printf("%3d",i);   // for first digit(or number) in each row (in your example these are 4,3,2,1)

    for(j=i;j<n;j++)
    {
        t+=k;   
        System.out.printf("%3d",t);
        k--;
    }
    System.out.print("\n");
}

输出:对于 n=8

                      8
                   7 15
                6 14 21
             5 13 20 26
          4 12 19 25 30
       3 11 18 24 29 33
    2 10 17 23 28 32 35
 1  9 16 22 27 31 34 36

http://ideone.com/C1O1GS

根据您的需要在数字周围留出空间。

PS:除非非常复杂,否则我永远不会建议使用数组编写任何模式代码。数组将使用额外的内存空间。

于 2013-10-21T18:50:07.850 回答
1
public static void main(String[] args) {
    // TODO code application logic here
    triangle(4);
}

static public void triangle(int n){
    int x = 0;
    for (int i = n;i>0;i--){
        System.out.print(i + " ");
        x = i+n;
        for (int j=0;j<n-i;j++){
            System.out.print(x - j + " ");
            x = x + n -j;
        }
        System.out.println("");
    }
}

4的输出:

4

3 7

2 6 9

1 5 8 10

6的输出:

6

5 11

4 10 15

3 9 14 18

2 8 13 17 20

1 7 12 16 19 21

于 2013-10-21T19:53:44.697 回答