【问题标题】:Pascal Triangle Not Printing Correctly in Java?帕斯卡三角形在 Java 中没有正确打印?
【发布时间】:2014-11-07 18:37:43
【问题描述】:

我得到了一个任务,要求我们根据用户输入的 N 值打印出帕斯卡三角形。我们提供了一个主函数,允许用户根据 n 值计算帕斯卡三角形。在这种情况下,如果 n 为 0,则帕斯卡三角形为 1。否则,当 n 大于 0 时,将创建并显示适当的帕斯卡三角形。以下是主要内容:

public class CSCD210Lab13
{
   public static void main(String[] args)
   {
      int n = 0;
      int [][] pascal = null;


      do
      {
         n = Lab13Methods.readN();
         pascal = Lab13Methods.createPascalsTriangle(n);
         Lab13Methods.printPascals(pascal);

      }while(MyUtil.goAgain());

   }// end main

}// end class

这是我的方法文件:

import java.util.*;

public class Lab13Methods
{
   public static int readN()
   {
      Scanner kb = new Scanner(System.in);
      System.out.println("Enter N: ");
      int n = kb.nextInt();
      while(n < 0)
      {
         System.out.println("Number Below 1. Re-Enter: ");
         n = kb.nextInt();
      }
      return n;
   }


   public static int[][] createPascalsTriangle(int n)
   {
      int[][]pascalTri = new int[n + 1][(n + 1) * 2];

      int sideOne, side;

      pascalTri[0][n - 1] = 1;
      sideOne = side = n - 1;

      for (int y = 1; y < n; y++)
      {
          pascalTri[y][sideOne] = 1;
          pascalTri[y][side] = 1;
          sideOne--;
          side++;

          for (int k = 1; k <= y; k++)
          {
              int left = pascalTri[y - 1][sideOne + (2 * k) - 1];
              int right = pascalTri[y - 1][sideOne + (2 * k) + 1];
              pascalTri[y][sideOne + (2 * k)] = left + right;
          }
      }
      return pascalTri;
  }

  public static void printPascals(int[][]pascal)
  {
      for (int f = 0; f < pascal.length; f++)
      {
          for (int v = 0; v < pascal[f].length; v++)
          {
              if (pascal[f][v] == 0)
              {
                  System.out.print("");
              } 
              else
              {
                  System.out.print(pascal[f][v]+" ");
              }
          }
          System.out.println();
      }
  }
}

这是我的 goAgain 文件:

public static boolean goAgain()
{
  boolean goAgain = false;
  String answer;
  Scanner kb = new Scanner(System.in);
      System.out.println();
      System.out.print("Do you want to go again? ");
      answer = kb.nextLine();

      while(!answer.equalsIgnoreCase("yes") && !answer.equalsIgnoreCase("no"))
      {
        System.out.print("Invalid Input. Do you want to go again? ");
        answer = kb.nextLine();
      }
      if(answer.equalsIgnoreCase("yes"))
      { 
        goAgain = true; 
      }
      else if(answer.equalsIgnoreCase("no"))
      {
        goAgain = false;
      }
      return goAgain;
   }      
}

我的问题是关于它是如何打印的。如果我输入 10 作为 N 的值,它应该是这样打印的:

1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1 
1 10 45 120 210 252 210 120 45 10 1 

但是,这是我的打印方式:

1 
1 1 1 1 
1 1 2 1 1 
1 1 3 3 1 1 
1 1 4 6 4 1 1 
1 1 5 10 10 5 1 1 
1 1 6 15 20 15 6 1 1 
1 1 7 21 35 35 21 7 1 1 
1 1 8 28 56 70 56 28 8 1 1 

我做错了什么?

【问题讨论】:

  • 您的生成方法可能有问题。尝试使用调试器从小开始(n = 3 然后 4 等)
  • 我试过 1,应该打印 1 1 1 但是,我的只是打印 1

标签: java pascals-triangle


【解决方案1】:

我认为你的错误可能在这里:

      pascalTri[y][sideOne] = 1;
      pascalTri[y][side] = 1;
      sideOne--;
      side++;

您的程序旨在以棋盘格模式填充数组的单元格: 对于任何两个相邻的行,一行将只有非零条目 在偶数位置,另一个将有非零条目 仅在奇数位置。

注意你做pascalTri[y][sideOne] = 1;,你减少sideOne。 这意味着如果你在一行应该使用奇数单元格, sideOne 现在很奇怪,但是当你这样做时 pascalTri[y][sideOne] = 1;sideOne 还是平的。所以你在一行中放了一个偶数条目 应该只有奇数条目。 这就是输出中所有额外 1 的来源。

只需删除这些行:

      pascalTri[y][sideOne] = 1;
      pascalTri[y][side] = 1;

他们所做的只是创造那些额外的、不需要的 1 值。所有正确的值 正在被其他语句写入数组中。

【讨论】:

    【解决方案2】:

    我不知道你是否知道帕斯卡三角形是什么,让我给你解释一下它是什么。

    11^0 = 1
    11^1 = 11
    11^2 = 121
    11^3 = 1331
    11^4 = 14641
    11^5 = 161051
    

    我不知道你为什么在需要的时候写了很多代码

    public static void printPascalsTriangle(int n)
    {
        long number=11l;
        for(int i=0;i<=n;i++)
        {
            System.out.println(new Double(Math.pow(number,i)).longValue());
        }
    }
    

    您需要一个超过五个的案例,可以像这样link 处理。

    【讨论】:

      【解决方案3】:

      参考我写的这个取决于用户输入的短帕斯卡代码:

      public class Pascal {
      
      public static void main(String[] args) {
          // TODO Auto-generated method stub
          Scanner scanner= new Scanner(System.in);
          System.out.println("Enter the Number of levels of Pascal");
          int levelCount = scanner.nextInt();
      
          for(int i =0;i<levelCount;i++) {
              int value = 1;
              for(int j=0;j<=i;j++) {
                  System.out.println(value);
                   value = value * (i - j) / (j + 1);
      
              }
              System.out.println("\n");
          }
      
      
      }
      

      }

      享受..!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多