4

CS学生です。ループの入門書を受け取ったばかりで、よく理解できていません。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. サイズ の補助 2D 配列を作成しますn
  2. 人間が行うように、対角線に従って 1 から n までの数字を配列に入れます。sコード内の はx + y合計を表します。その合計は、すべての対角線で一定です。最初の対角線 (最長のもの) では、合計は に等しくなりn - 1ます。2 番目の対角線の合計は 1nです。最後の「対角線」 (右下隅) の合計は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

上で説明したように、数の三角形を出力する方法はたくさんあることに注意してください。たとえば、次の 2 つがあります。

// 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
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 に答える