8

これを作成するにはどうすればよいですか。

*******
-*****-
--***--
---*---
--***--
-*****-
*******

以下は、上記を達成するために作成したコードですが、期待どおりに機能していません。

    public static void stars(/*int jmlBaris*/) {
    for ( int i = 7; i >= 1; i-=2) {
        for (int j = 1; j <= i; j++) {

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

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

8 に答える 8

9

これは私がそれを書くかもしれない方法です。

// three loops
public static void stars(int size) {
    for (int y = 0; y < size; y++) {
        for (int i = 0; i < y && i < size - y - 1; i++)
            System.out.print(' ');
        for (int i = Math.min(y, size - y - 1); i < Math.max(y + 1, size - y); i++)
            System.out.print('*');
        System.out.println();
    }
}

また

// two loops
public static void stars(int size) {
    for (int y = 0; y < size; y++) {
        for (int x = 0; x < size; x++)
            System.out.print(
                    (x >= y && x < size - y) ||
                            (x >= size - y - 1 && x <= y) ? '*' : ' ');
        System.out.println();
    }
}

また

// one loop
public static void stars(int size) {
    for (int i = 0; i < size * size; i++) {
        int y = i / size, x = i % size;
        System.out.print(
                (x >= y && x < size - y) ||
                        (x >= size - y - 1 && x <= y) ? '*' : ' ');
        if (x == size - 1)
            System.out.println();
    }
}

注: これが 1 つ、2 つ、または 3 つのループを使用するかどうかにかかわらず、時間の複雑さは O(N^2) です。これを決定する簡単な方法は、生成される星の数がどのように行われても O(N^2) であることです。

于 2012-12-19T15:04:07.897 に答える
4

私は部分文字列でこのようなことをします。

String a = "*******";  //7 stars
String blank = "        "; //7 spaces
int j = 7;
for (int i = 0; i < 7; i++) {
    if (i > j){
        System.out.print(blank.substring(0,i));
        System.out.println(a.substring(i,j));
        }
    else{
        System.out.print(blank.substring(0,j));
        System.out.println(a.substring(j,i));
        }
    j--;
}
System.out.println(a);

**以前の編集は機能しませんでした。変更が行われました。

これは機能します。

于 2012-12-19T14:54:42.733 に答える
2

IDEOne でコンパイルしたこのコードのようなものを試してください (ただし、動作するようです): http://ideone.com/9xZ1YB

class Main
{
    public static void main(String[] args)
    {
        stars();
    }

    static void stars()
    {
        final int MAX_WIDTH = 7;

        for (int i = 0; i < 7; ++i)
        {
            int width;

            if (i < 3) width = MAX_WIDTH - i * 2;
            else if (i > 3) width = (i - 3) * 2 + 1;
            else width = 1;

            // Before spaces

            for (int j = 0; j < (MAX_WIDTH - width) / 2; ++j)
            {
                System.out.print(" ");
            }

            // Stars

            for (int j = 0; j < width; ++j)
            {
                System.out.print("*");
            }

            // After spaces

            for (int j = 0; j < (MAX_WIDTH - width) / 2; ++j)
            {
                System.out.print(" ");
            }

            System.out.println();
        }
    }
}
于 2012-12-19T14:50:47.557 に答える
1

アルゴリズムの初心者には、構造をサブパートに分解してから、パターンの解決を試みることをお勧めします。

この特定のパターンでは、いくつかの三角形に分割できます。for次に、下の画像に示すように、各三角形はさまざまなループによって解決されます。

パターンを部分構造に分割する

public static void printPattern(int num) {
    // this loop generates first 4 lines
    for (int i = 0; i < num / 2 + 1; i++) {
        // draws the red triangle of '-'
        for (int j = 0; j < i; j++) {
            System.out.print("-");
        }
        // draws the green triangle of '*'
        for (int j = i; j < num / 2 + 1; j++) {
            System.out.print("*");
        }
        // draws the blue triangle of '*'
        for (int j = i + 1; j < num / 2 + 1; j++) {
            System.out.print("*");
        }
        // draws the orange triangle of '-'
        for (int j = 0; j < i; j++) {
            System.out.print("-");
        }
        System.out.println();
    }

    /* this loop generates last 3 lines */
    for (int i = 0; i < num / 2; i++) {
        // draws the green triangle of '-'
        for (int j = i + 1; j < num / 2; j++) {
            System.out.print("-");
        }
        // draws the red triangle of '*'
        for (int j = 0; j < i + 2; j++) {
            System.out.print("*");
        }
        // draws the orange triangle of '*'
        for (int j = 0; j < i + 1; j++) {
            System.out.print("*");
        }
        // draws the blue triangle of '-'
        for (int j = i + 1; j < num / 2; j++) {
            System.out.print("-");
        }
        System.out.println();
    }
}

同様の手法を使用して、任意のパターンを生成できます。

于 2012-12-19T16:41:07.473 に答える
0
    public static void stars(/*int jmlBaris*/){
    String starstr = "*";
    String blank = "_";
    int spaceBlank;;
    for(int i=7; i>=1;i-=2){
        spaceBlank = (7-i)*.5;
        String starrep = StringUtils.repeat(starstr, i);
        String blankrep = StrinUtils.repeat(blank, spacesBlank);
        system.out.println(blankrep + starrep + blankrep);
    }
    for(int j=3 j<=7; j+=2){
        spaceBlank = (7-j)*.5;
        starrep = StringUtils.repeat(starstr, j);
         String blankrep = StrinUtils.repeat(blank, spacesBlank);
        system.out.println(blankrep + starrep  + blankrep);
    }
}    
public static void main(String[] args){
    stars();
}
于 2012-12-19T15:12:58.793 に答える
0
    int N = 7;
    for (int y=0; y<N; y++)
    {
        for (int x=0; x<N; x++)
            System.out.print( (y-x)*(N-y-x-1)<=0 ? '*' : '-');
        System.out.println();
    }

または、より対称的に、

    int n = 3;
    for (int y=-n; y<=n; y++)
    {
        for (int x=-n; x<=n; x++)
            System.out.print( y*y>=x*x ? '*' : '-');
        System.out.println();
    }
于 2012-12-19T16:47:53.703 に答える
0

コードにスペースを入れるのに欠けているものはほとんどありません。適切なスペースは気にしません。誰がそれを見ることができますか? しかし、左のスペースは非常に重要です!!

これを試して:

public static void stars(/*int jmlBaris*/) {
    for ( int i = 7; i >= 1; i-=2) {
        for (int k = 0; k < ((7-i) / 2); k++){ /* Missing Here */
            System.out.print(" "); /* Missing Here */
        } /* Missing Here */

        for (int j = 1; j <= i; j++) {
            System.out.print("*");
        }

        System.out.println("");
    }

    for (int i = 1; i <= 7; i+=2) {
        for (int k = 0; k < ((7-i) / 2); k++){ /* Missing Here */
            System.out.print(" "); /* Missing Here */
        } /* Missing Here */

        for (int j = 1; j <= i; j++){
            System.out.print("*");
        }

        System.out.println("");
    }
}
于 2012-12-19T15:38:17.330 に答える
0

私があなたを正しく理解していれば、問題は2行目から7行目にインデントを印刷することです。

アスタリスク記号が「x」に置き換えられ、空白が「-」に置き換えられた同じ問題を想像してみてください。次に、描画する必要があります

xxxxxxx
-xxxxx-
--xxx--
---x---
--xxx--
-xxxxx-
xxxxxxx

つまり、1 番目、2 番目、3 番目の文字列のアスタリスクの前に、それぞれ 0、1、2 個のスペースを出力する必要があります。詳細はお任せします。

于 2012-12-19T14:59:30.347 に答える