新手报到,请多指教!!

解决方案 »

  1.   

    我也是新手,方法仅供参考,思想应该没有问题!!~~public class Sanjiao {
    public static void main (String[] args){
    int[] num1=new int[10];
    int[] num2=new int[10];
    num1[0]=1;
    num2[0]=1;
    num2[1]=1;
    int i=0;
    System.out.println(num1[0]);
    for(int j=0;j<8;j++){
    for( i=1;i<10;i++){
    num1[i]=num2[i]+num2[i-1];
    }
               int []temp;
               temp=num1;
               num1=num2;
               num2=temp;

    for( i=0;i<j+2;i++){
    System.out.print(num1[i]+" ");
    }
    System.out.println("");
    }
    }
    }
      

  2.   

    原来在 CSDN 回复的,可以参考一下。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(" ");
            }
        }
    }代码看上去很多,其实核心部分只有 printYanghuiTriangle 这个方法,
    为了节省空间采用了一个数组进行计算。其他的方法都是用于输出格式的方法。                                      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
      

  3.   

    1楼的FOR循环里面有点不太懂,
    for(int j=0;j <8;j++){ 
    for( i=1;i <10;i++){ 
    num1[i]=num2[i]+num2[i-1]; 

              int []temp; 
              temp=num1; 
              num1=num2; 
              num2=temp; 这个求的是什么??里面的num2[i-1]是什么意思?当i==3的时候num2[i-1]是多少??
    2楼里面有些东西还没学过,不懂里面一些方法的意思,比如IllegalArgumentException()应该是一个帮助文档里面的.
    但是不太清楚里面所表达的意思!!
    不过还是谢谢大家的帮忙!
      

  4.   

    IllegalArgumentException 是一个内置的运行期异常,也就是在传入的参数非法时抛出异常。何时为参数非法,需要手工进行判断,比如我在 2 楼的当传入的参数小于 1 或者大于 30 时就
    抛出这个异常,下面的也就不做了。
      

  5.   

    这个问题 我也很不懂; 果子这个程序,我看不大懂,可能是一些算法的问题, 你为什么要 求 最大数字的长度还有* 阶乘计算 ???? long result = start > 0 ? start : 1L;
            while(num > start) {
                result *= num--;
            }一连串的 问号?我估计你可能要解释  得  比较详细  大家才能懂了
      

  6.   

    呵呵,计算最大数字长度是为了能让位数较少的数字前面加上一定数量的空格啊。比如说 2 楼输出中的最后一行最大的数字是 3 位数,那我们输出时每一个数字都得占满 3 位数,
    如果是 1 位数的话,得在前面加两个空格,如果是两个数的话得加一个空格,这样才能保证输出
    的是三角形的形状啊,否则就是歪歪扭扭的不整齐。阶乘计算主要是为了使用二项式定理公式,杨辉三角形中的各项可以通过二项式定理公式计算出来的,
    杨辉三角形中的各项称为二项式系数。计算采用组合公式:
            k           n!
           C    =  ------------
            n       (n - k)!k!比如说我们要计算杨辉三角形中第 5 行第 3 个数字,从 0 开始算的话就是第 4 行第 2 个数字,
    即公式中:k = 2, n = 4     4!              1 * 2 * 3 * 4
    ------------  =  ------------------- = 6
     (4 - 2)!2!       (1 * 2) * (1 * 2)因此可以算出第 5 行第 3 个数字为 6。一行中最大的数字值行该行的当中呵呵,知道为什么这里要使用阶乘了么?
      

  7.   

    听了以上 解释明白了 一些;
    但是还是有些问题 无法解决:
    看这里:
    for(int i = 0; i < lines; i++) {
                line[0] = line[i] = 1;//每行的头尾 2个数 都是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);
            }
    这个,j的循环中, 不用定义k,pre吗??这个循环用来 做什么的?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();
            }
        }这个方法 大概的意思 可以看懂 是用来控制打印的,不足最大length的补空格,我不明白的就是
    if(width > 1) {
                System.out.println();
            }
    还有
    printSpaces((yanghui.length - line) * width);
    这个里面是什么呀?