使用Java打印三角形(半金字塔)图案

3
我需要打印一个三角形图案(半金字塔),如下所示:
1
0 1
1 0 1
0 1 0 1

我使用了这个程序。
class tri{
 public static void main(String arg[]){
    int i,j,a = 1, b =0, c=0;
    for(i=1; i<=4; i++){

        for(j=1; j<=i; j++){
            System.out.print(a+ " ");
            c = a;
            a = b;
            b = c;              
        }
        System.out.println();
    }
 }
}

但是这个代码输出的图案如下所示:

上述代码的输出

请问有没有人能帮我修改一下代码,让它输出正确的图案呢?


1
这是一个三角形。你有什么问题吗?你所关心的值是什么? - Nabin
是的,问题是要打印给定模式,并像给定的三角形一样精确地显示值。 - Luzan Baral
1
这里有一些Haskell代码,只是为了好玩。https://gist.github.com/chris-martin/846dafd72072622a182b - Chris Martin
9个回答

5

您需要正确设置起始值。因为您正在不断交换。

比如第二行0 1

最后一个元素为1,(a = 1, b = 0),在下一行第一个元素交换时变为(a = 0, b = 1)

然而这是不正确的,因为它应该从前一个状态开始以(a = 1)而不是(a = 0)开始。

        int i,j,a = 1, b =0, c=0;
        for (i = 1; i <= 4; i++){
            if (i % 2 == 0) {
                a = 0;
                b = 1;          
            } else {
                a = 1;
                b = 0;          
            } 
            for(j=1; j<=i; j++) {
                System.out.print(a+ " ");
                c = a; 
                a = b;
                b = c;                           
            }           
            System.out.println();
        }

你也可以使用异或操作在 01 之间进行切换:

int i, j, a = 1;
for (i = 1; i <= 4; i++){
    a = i % 2;          
    for(j=1; j<=i; j++) {
        System.out.print(a+ " ");
        a = a ^ 1;                         
    }           
    System.out.println();
}

然而更简短的解决方案是:
String str = "";
for (int i = 1; i <= 4; i++) {
    str = (i % 2) + " " + str;  
    System.out.println(str);    
} 

输出:

1 
0 1 
1 0 1 
0 1 0 1 

+1 第一种解决方案中不需要初始化 a,bc。我真的很喜欢最后(也是最简单)的解决方案! - Nir Alfasi

5
最简单的形式将是:
String str = "";
for (int i = 1; i <= 4; i++) {
    str = (i % 2) + " " + str;  
    System.out.println(str);    
} 

这将按您所需的输出结果呈现。
1
0 1
1 0 1
0 1 0 1

3
您可以使用布尔标志来检查当前是否从1或0开始;
示例:
boolean flag = true;
    for(int i=1; i<=4; i++){

        for(int j=1; j<=i; j++){
            if(flag)
                System.out.print("1 ");
            else
                System.out.print("0 ");
            flag = !flag;
        }
        if((i % 2) == 0)
            flag = true;
        else
            flag = false;
        System.out.println();
    }

结果:

1 
0 1 
1 0 1 
0 1 0 1 

你可以改进 if(flag == true) 这段代码,使用 if(flag) 来代替,因为你在比较一个 boolean 类型的变量和另一个 boolean 类型的变量,这会返回一个 boolean 类型的值,所以你只需要检查变量本身即可。 - Frakcool
实际上你根本不需要标志:在第一个“if”中使用以下表达式即可:(i + j) % 2 == 0 - Nir Alfasi
+1 用于编辑 :) 正如 @alfasin 所说,你可以那样做,但是... 呃,代码这样更清晰 - Frakcool
@alfasin 确实是这样。 - Rod_Algonquin

2
   int x=1,y=1;
   for(int i=1;i<8;i++){
       for(int k=0;k<i;k++){
           y=(k==0) ? x:y;
           System.out.print(y+" ");
           y=(y==1) ? 0:1;
       }
       System.out.println("");
       x=(x==1) ? 0:1;
   }

输出--- 在此输入图片描述


1

我希望你能翻译我的答案。看到@sujithvm的解决方案更加简短高效。

    int sideLength = 4;
    for(int i = 0 ; i < sideLength ; i++)
    {
        for(int j = 0 ; j <= i ; j++)
        {
            System.out.print((i + j + 1) % 2 + " ");
        }
        System.out.println();
    }

1

代码

public class pra1 {
    public static void main(String[] args) {
        int  space, rows=11, k=0;
          //  Scanner scan = new Scanner(System.in);
          //  System.out.print("Enter Number of Rows : ");
          //  rows = scan.nextInt();
        //  rowa=6;

            for(int i=1; i<=rows; i++)
            {
                for(space=1; space<=(rows-i); space++)
                {
                    System.out.print("  ");
                }
                while(k != (2*i-1))
                {  // int p=k;
                    if(k%2==0)
                    {

                    System.out.print("1 ");
                   //  System.out.print("  ");
                    }if(k%2!=0 )
                    {

                    System.out.print("0 ");
                   // System.out.print("  ");
                    }

                    else{
                    System.out.print("");
                    }
                 //   p--;
                    k++;
                }
                k = 0;
                System.out.println();
            }

    }

}

输出

                    1 
                  1 0 1 
                1 0 1 0 1 
              1 0 1 0 1 0 1 
            1 0 1 0 1 0 1 0 1 
          1 0 1 0 1 0 1 0 1 0 1 
        1 0 1 0 1 0 1 0 1 0 1 0 1 
      1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 
    1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 
  1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 

0

适合初学者的完整Java程序:

public class PrintPattern15

{

public static void main(String args[])
{
    int n = 5;
    PrintPattern15 d = new PrintPattern15();
    d.printPattern(n);
}
public void printPattern(int noOfRows)
{   
    for(int i = 1; i <= noOfRows; i++ )
    {
        printRows(i);
    }
}
public void printRows(int startPt)
{   
    for(int i = startPt ; i >= 1; i--)
    {
        System.out.print(i%2);
    }
        System.out.println();

}

}


0
这是我解决问题的方法:
int k = 0;    
for (i = 1; i <= 4; i++){
k = (i%2 == 0)? 1:0;

for(j=1; j<=i; j++) {
    System.out.print(k+ " ");
    k = k==0?1:0;                       
}           
System.out.println();
}

0
这个对我有效:
public class DrawPattern {

    public static void main(String[] args) {
        int i, j;
        int num = 7;
        for (i = 0; i <num; i++) {
            for (j = 0; j < i; j++) {
                if (isConditionMatch(num, i, j)) {
                    System.out.print("0");
                } else {
                    System.out.print("1");
                }
            }
            System.out.println();
        }

    }

    private static boolean isConditionMatch(int num, int i, int j) {
        return (i%2 != 0 && j%2 !=0 || (i%2 == 0 && j%2==0));
    }
}

输出:

1
01
101
0101
10101
010101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接