提出一些问题,希望给解释一下看这里: 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吗??这个循环用来 做什么的? 
line[i - j] = line[j] += 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(); 
        } 
这个width 表示什么 ?还有 
printSpaces((yanghui.length - line) * width); 
这个里面是什么呀?

解决方案 »

  1.   

    源代码 也贴上
    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(" ");
            }
        }
    }
      

  2.   

    int j = 1, k = i / 2, pre = line[0]; 定义了三个变量,中间是逗号啊,这样不用每次判断的时候都再计算一次k 
      

  3.   

    第一个循环是用来找出杨辉三角的第i+1行上的数字,比如第一行是1 ,第二行是 1 1。
    int j = 1, k = i / 2, pre = line[0]这句就定义了K、pre了啊,就象int j,k,pre;只不过在定义的同时就赋值了。
    line[i - j] = line[j] += pre;相当于 line[j]=line[j]+pre;line[i-j]=line[j];
      

  4.   

    if(width > 1) {
        System.out.println();
    }width 是作为参数传递进去的,值表示指定行数的杨辉三角形中最大数字的宽度,我记
    得我上次跟你说过的啊!这句没别的意思,就是最大的宽度大于 1 个字符的时候,三角形的每行当中空开来一行,
    这样看上去会比较漂亮,不会粘在一块,更像一个三角形。printSpaces((yanghui.length - line) * width);
    如果不明白的话,把这句注释掉看看输出结果是什么,我想很快就能明白这句话的意思了。
      

  5.   

    看了1天 ,格式 是彻底明白了;算法还是有 点   晕
    哪位老兄解释一下
    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);
            }
        }
      

  6.   

    这种东西 需要你跟踪 死看 硬敲。不是 谁帮助一两句话 说说就明白了。方法的注释 1 楼 都已经给了 只要跟踪过去在跟回来 就行了。在不 在 eclipse 断点下运行 看看结果 跟踪~
      

  7.   

    for(int j = 1, k = i / 2, pre = line[0]; j <= k; j++)在这一行中,k和pre已经定义了,for循环第一个分号前面定义了三个变量,j,k,pre
    line[i - j] = line[j] += pre; 这句话写的有些复杂,主要考虑的是运算符的优先级,一般来说,赋值运算符“=”具有最低级别的优先级,这句话是先执行“+=”,然后再执行“=”,可以分解一下,等价于:
    line[j] = line[j] + pre ;
    line[i-j] = line[j];仔细理解算法的话,如楼上各位所说“杨辉三角形”,即
                     1
                 1   1
               1   2   1
            1    3   3   1
         1    4    6   4   1
       1   5    10   10  5   1依次类推.