提出一些问题,希望给解释一下看这里: 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);
这个里面是什么呀?
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);
这个里面是什么呀?
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(" ");
}
}
}
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];
System.out.println();
}width 是作为参数传递进去的,值表示指定行数的杨辉三角形中最大数字的宽度,我记
得我上次跟你说过的啊!这句没别的意思,就是最大的宽度大于 1 个字符的时候,三角形的每行当中空开来一行,
这样看上去会比较漂亮,不会粘在一块,更像一个三角形。printSpaces((yanghui.length - line) * width);
如果不明白的话,把这句注释掉看看输出结果是什么,我想很快就能明白这句话的意思了。
哪位老兄解释一下
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);
}
}
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依次类推.