当前位置: 代码迷 >> Java相关 >> java 杨辉三角
  详细解决方案

java 杨辉三角

热度:769   发布时间:2010-03-25 20:46:22.0
java 杨辉三角
最近写了一个关于杨辉三角的代码,不过出了些问题
代码如下:
import javax.swing.JOptionPane;
public class San
{
  public static void main(String args[])
{
   String row;
   int row1;
   row=JOptionPane.showInputDialog("输入行数:");
   row1=Integer.parseInt(row);
   int ss[][]=new int[row1][];
   int i,j;
   ss[0][0]=ss[1][0]=ss[1][1]=1;
   for(i=3;i<row1;i++)
   {
    ss[i][0]=ss[i][i-1]=1;
    for(j=0;j<i-1;j++)
    {
      ss[i][j]=ss[i-1][j]+ss[i-1][j+1];
    }
   }
   for(i=0;i<row1;i++)
  {
   for(j=0;j<i-1;j++)
  {
   System.out.print(ss[i][j]);
   }
   System.out.println();
   }
   System.exit(0);
}
}
运行结果如下:
Exception in thread "main" java.lang.NullPointerException
        at San.main(San.java:12)
另外还有一个问题:如果成功更改的话,杨辉三角会以直角三角形的方式输出,但是如果要用等腰三角形输出呢,能不能把其中的重要部分写一下,谢谢帮助。
搜索更多相关的解决方案: 杨辉三角  java  

----------------解决方案--------------------------------------------------------
import javax.swing.JOptionPane;
public class San
{
  public static void main(String args[])
{
   String row;
   int row1;
   row=JOptionPane.showInputDialog("输入行数:");
   row1=Integer.parseInt(row);
   int ss[][]=new int[row1][row1];  //二维数组要分配内存空间,否则空指针异常
   int i,j;
   ss[0][0]=ss[1][0]=ss[1][1]=1;
   for(i=3;i<row1;i++)
   {
    ss[i][0]=ss[i][i-1]=1;
    for(j=0;j<i-1;j++)
    {
      ss[i][j]=ss[i-1][j]+ss[i-1][j+1];
    }
   }
   for(i=0;i<row1;i++)
  {
   for(j=0;j<i-1;j++)
  {
   System.out.print(ss[i][j]);
   }
   System.out.println();
   }
   System.exit(0);
}
}

----------------解决方案--------------------------------------------------------
package cn.dadongzicool.examplesanjiao;

import javax.swing.JOptionPane;

public class San {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
           String rowString;
           int rowInt;
           
           rowString = JOptionPane.showInputDialog("输入行数:");
           rowInt = Integer.parseInt(rowString);
           
           int triangle[][]=new int[rowInt][rowInt * 2 - 1];
           
           for(int i = 0;i < rowInt;i++){
                  for(int j = 0;j < rowInt * 2 -1;j++){
                      triangle[i][j] = -1;
                  }
              }
           
           for(int i = 0;i < rowInt;i++){
               triangle[(rowInt * 2 - 1) / 2 - i][i] = 1;
               triangle[(rowInt * 2 - 1) / 2 - i][rowInt * 2 - 1 - i - 1] = 1;
           }
           
           for(int i = 2;i < rowInt;i++){
                  for(int j = 0;j < rowInt * 2 -1;j++){
                      if(j > rowInt - i - 1 && j < rowInt * 2 - 1 - 1
                              && triangle[i - 1][j -1] != -1 && triangle[i -1][j + 1] != -1)
                      triangle[i][j] = triangle[i - 1][j -1] + triangle[i -1][j + 1];
                  }
           }
           
          for(int i = 0;i < rowInt;i++){
              for(int j = 0;j < rowInt * 2 - 1;j++){
                  if(triangle[i][j] == -1){
                      System.out.print(" ");
                  }
                  else{
                      System.out.print(triangle[i][j]);
                  }
              }
              System.out.println();
          }
           System.exit(0);

    }

}

自己写了一下  还是不太完美   五行以内还能凑合着看   因为行数越多 数字占用的字节越多 用一个空格来区分就有点小了


效果如下

row = 5:
    1   
   1 1   
  1 2 1  
1 3 3 1
1 4 6 4 1

row = 6:
     1     
    1 1   
   1 2 1   
  1 3 3 1  
1 4 6 4 1
1 5 10 10 5 1


row = 10:
         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


row = 20:
                   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 11 55 165 330 462 462 330 165 55 11 1        
       1 12 66 220 495 792 924 792 495 220 66 12 1      
      1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1      
     1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1     
    1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1   
   1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1   
  1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1  
1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1
1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1


----------------解决方案--------------------------------------------------------
回复完了 发现最后一行 有点偏移  实际上运行效果没有偏移的  不知道为什么回复后 就有了一个空格的偏移
----------------解决方案--------------------------------------------------------
回复 4楼 dadongzicool
谢谢,其实是没有偏移的,不过,因为有的行有两个两位数,而下一行三个两位数,故此多了一位;因此下面的行都有这样后果,因而显得偏移了一行,不知道我解释的对不对。
----------------解决方案--------------------------------------------------------
回复 4楼 dadongzicool
版主,问一下,java里面有没有一个函数或类能限制“输出数”以几个格输出。
----------------解决方案--------------------------------------------------------
import javax.swing.JOptionPane;
import java.io.*;

public class San {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
           String rowString;
           int rowInt;
           
           rowString = JOptionPane.showInputDialog("lines:");
           rowInt = Integer.parseInt(rowString);
           
           int triangle[][]=new int[rowInt][rowInt * 2 - 1];
           
           for(int i = 0;i < rowInt;i++){
                  for(int j = 0;j < rowInt * 2 -1;j++){
                      triangle[i][j] = -1;
                  }
              }
           
           for(int i = 0;i < rowInt;i++){
               triangle[(rowInt * 2 - 1) / 2 - i][i] = 1;
               triangle[(rowInt * 2 - 1) / 2 - i][rowInt * 2 - 1 - i - 1] = 1;
           }
           
           for(int i = 2;i < rowInt;i++){
                  for(int j = 0;j < rowInt * 2 -1;j++){
                      if(j > rowInt - i - 1 && j < rowInt * 2 - 1 - 1
                              && triangle[i - 1][j -1] != -1 && triangle[i -1][j + 1] != -1)
                      triangle[i][j] = triangle[i - 1][j -1] + triangle[i -1][j + 1];
                  }
           }
           
          for(int i = 0;i < rowInt;i++){
              for(int j = 0;j < rowInt * 2 - 1;j++){
                  if(triangle[i][j] == -1){
                      System.out.printf("%3s"," ");   //用printf方法以3个格输出字符串
                  }
                  else{
                      System.out.printf("%3d",triangle[i][j]); //用printf方法以3个格输出数字

                  }
              }
              System.out.println();
          }
           System.exit(0);

    }

}

[ 本帖最后由 lampeter123 于 2010-3-27 11:05 编辑 ]
----------------解决方案--------------------------------------------------------
printf()是JDK5.0以后才加入的,用法类似于C语言
----------------解决方案--------------------------------------------------------
回复 7楼 lampeter123
貌似稍微规则了一点 但是 行数很多的时候......
----------------解决方案--------------------------------------------------------
你可的控制输出的格数,如果是2位数就输出2格,3位3格,4位4格。。。。
行数太多的话,你的屏幕都爆满了
----------------解决方案--------------------------------------------------------
  相关解决方案