读书人

杨辉三角有关问题2

发布时间: 2012-07-19 16:02:20 作者: rapoo

杨辉三角问题2


import javax.swing.JOptionPane;

public class test3 {


public static void main(String[] args) {

String num=JOptionPane.showInputDialog("请输入杨辉三角形的行数:50以内的数字");
try{
int fei= Integer.parseInt(num);
}
catch (NumberFormatException e){

System.out.println("请输入数字,不可为空");
return;
}
int n = Integer.valueOf(num);
String hou ="%16d";
String xiao =" ";
//String ff=" ";
Long c=0l;
if(n>50)
System.out.print("请输入正确的值");

else {
/* if(n<=10){ hou="%6d"; xiao=" ";}
else if(n<=20){ hou="%10d"; xiao=" ";}
else if(n<=30) {hou="%12d"; xiao=" ";}
else if(n<=40) {hou="%14d"; xiao=" ";} */


long[][] a=new long[n][n];


for(int i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
}


for(int i=2;i<n;i++) {
for(int j=1;j<i;j++) {
a[i][j]=a[i-1][j-1]+a[i-1][j];
c = (a[i][j/2]);}
}



String d = c.toString();
for (int e =1; e<=d.length(); ++e){
hou="%"+(e+1)+"d";
xiao=" ";

}

for(int i=0;i<n;i++)
{
//打印空格
for(int k=0;k<n-i;++k)
System.out.print(xiao);
//打印数字
for(int j=0;j<=i;j++)
System.out.printf(hou,a[i][j]);

System.out.println(" ");
//换行
System.out.println();
}
}
}
}

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

这是5行时候结果

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



这是10行结果

如何让空格也动态变化 望大神教教








------解决方案--------------------


第一行打错了,不好意思:
System.out.printf("%5d", 1);
System.out.printf("%5d%5d%5d", 1, 1, 1);
[解决办法]

Java code
public class Yanghui {    public static void main(String[] args) {        Yanghui yang = new Yanghui();        yang.printYanghuiTriangle(13);    }    /**     * 生成指定行数的杨辉三角形     *     * @param lines 杨辉三角形的行数     */    public void printYanghuiTriangle(int lines) {        if(lines < 1) {            throw new IllegalArgumentException("lines must be great than 0.");        }        if(lines > 30) {            throw new IllegalArgumentException("lines is too big.");        }        int[] line = new int[lines];        int maxLen = getMaxLen(lines);        for(int i = 0; i < lines; i++) {            line[0] = line[i] = 1;            for(int j = 1, k = i / 2, pre = line[0]; j <= k; j++) {                int cur = line[j];                line[i - j] = line[j] += pre;                pre = cur;            }            printLine(line, i + 1, maxLen);        }    }    /**     * 根据指定行数的杨辉三角形,计算其中最大数字的长度     * @param lines 杨辉三角形的行数     * @return      最大数字的长度     */    private int getMaxLen(int lines) {        int k = lines / 2;        long maxNum = factorial(k + 1, lines - 1) / factorial(1, lines - 1 - k);        return getLength(maxNum);    }    /**     * 阶乘计算     * @param start 阶乘计算的起始数字     * @param num   阶乘计算的终止数字     * @return      阶乘计算结果     */    private long factorial(int start, int num) {        long result = start > 0 ? start : 1L;        while(num > start) {            result *= num--;        }        return result;    }    /**     * 根据指定数字计算数字的长度     * @param num   数字     * @return      数字的长度     */    private int getLength(long num) {        int len = 0;        while(num > 0L) {            num /= 10L;            len++;        }        return len;    }    private void printLine(int[] yanghui, int line, int width) {        printSpaces((yanghui.length - line) * width);        for(int i = 0; i < line; i++) {            if(i > 0) {                printSpaces(width);            }            printSpaces(width - getLength(yanghui[i]));            System.out.print(yanghui[i]);        }        System.out.println();        if(width > 1) {            System.out.println();        }    }    private void printSpaces(int spaceCount) {        for(int i = 0; i < spaceCount; i++) {            System.out.print(" ");        }    }}                                      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 

读书人网 >J2SE开发

热点推荐