求高手解释下这个 JAVA代码 是编写杨辉三角形的

public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
for(int j = 0; j < i + 1; j++) {
int num = 1;
for(int k = 0; k < j; k++)
{
num = num * (i - k) / (k + 1);
}
System.out.print( " "+num+" ");
}
System.out.println();
}
}
最好每句都能帮我解释下

public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < i + 1; j++) {

int num = 1;
for (int k = 0; k < j; k++) {
num = num * (i - k) / (k + 1);
}
System.out.print(" " + num + " ");

}
System.out.println();
}
}
/*
* 首先说说i 循环 和j循环 原理是 这样 之所以j < i + 1 用白话说是 i是几
* 就有几列 所以你会发现如果当前行是5 那么列也肯定是5 目的是为了单纯的三
* 角形。 在说说从int num = 1开始一直到k循环结束,本来一个三角形 有i和j
* 的循环完全足以。多加个k循环是要将每行的所有列进行计算并得到sum ,至于
* num = num * (i - k) / (k + 1)的结果 我想作者是根据要求写这么样一个
* 公式的 完全就是一个数学问题了,那么我就需要知道 他要求每行出来的结果是什么
* 样,我才能分析他为什么写这么样一个公式,也许一些大侠可以反推,呵呵我的水平
* 仅仅在此 仅供参考
*
*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-25
第一:可以参考在潭浩强出的C语言一书中对杨辉三角形算法做了详细的阐述
第二:可以在调试器中对这一程序进行单步执行,便可以知道算法的意思
第2个回答  2010-03-25
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {//for循环i从0到9
for(int j = 0; j < i + 1; j++) {//for循环j从0到i
int num = 1;//局部变量num
for(int k = 0; k < j; k++){//for循环k从0到j-1
num = num * (i - k) / (k + 1);//k每加1,计算一次num的值
}
System.out.print( " "+num+" ");//j每加1,打印一次 num !
}
System.out.println();//i每加1换行
}
}

自己找假定数据走一遍程序,理解一下!
第3个回答  2010-03-25
第一个for控制行数,你的写法是10行,(0<= i < 10).
第二个for控制换行,当一行结束时输出\n.
第三个for控制每行的数字数,比如j=0时,k>=j,第一行是没有数字的。
num就是要输出的数,这个数在每执行一次都会被赋于一个新的值,具体值=后面就是。
话说你真的确定这是杨辉三角么?我怎么看着有点不太像。。
你可以参考下面这个C程序写,如果看不懂的话还是多看点最基本的吧,没法再简单了。
#include<stdio.h>
#define M 10
void main()
{
int a[M][M], i , j ;
for(i=0;i<M;i++)
for(j=0;j<=i;j++)
{
if(i==j||j==0)
a[i][j]=1;
else
a[i][j]=a[i-1][j]+a[i-1][j-1];
printf("%5d",a[i][j]);
if(i==j)printf("\n");
}
}
第4个回答  2010-03-25
public class YangHui{
public static void main(String[] args) {
//第一层循环控制输出的行数
for(int i = 0; i < 10; i++) {
//第二层循环控制每行的列数
for(int j = 0; j < i + 1; j++) {
int num = 1;
//第三层循环用于计算每一个值(核心)
for(int k = 0; k < j; k++){
num = num * (i - k) / (k + 1);
}
//输出当前值
System.out.print( " "+num+" ");
}
//换行
System.out.println();
}
}
}
第5个回答  2010-03-25
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
=========
先说说其规律:
你的算法不是以v[i,j]=v[i-1][j]+v[i-1][j-1]规律来计算的。
行列都是以0开始,在上图中,最后一个4出现的位置是第4行,最3列。那么v[4,3]的值是多少呢?C4,3(排列组合),即4。我们都来测试一个数,v[3,2]的值为C3,2,即3。这就是规律。
========
算法:
计算v[3,2]的方法是(3*2)/(1*2),计算v[4,3]的方法是(4*3*2)/(1*2*3),如果你学过高中数学,那么你应该知道排列组合的公式。如果你真不知道,那么你先去学习一下。
========
分析代码:
把你的代码中最里层的循环去掉,替换成输出*。
for(int i = 0; i < 10; i++) {
for(int j = 0; j < i + 1; j++) {

System.out.println("*");

}
System.out.println();
}

输出结果为:
*
* *
* * *
* * * *
* * * * *
......

分析结果是:i循环控制行数,即(i<10),那么就打印10行。j循环控制列数,即(j<i+1),就是最几行就打印几+1个星。所以每行的星星数不等。

再来分析刚刚去除的k循环:
上图与杨辉三角形不同之处在于,一个是打印*,一个是打印数字,并且数字的值不同。前面已经分析过规律了,当然k循环就是计算数值,并打印该数值了。
初始数值为int num=1;
然后让num*=i-0,num*=i-1,......,一共循环j次。
然后再让num/=1,num/=2,.....一共循环j次。
==============
举例说明:求v[4,2]的值,即i=4,j=2。
int num=1;
num*=4-0,num*=4-1(一共循环2次,即j次)
num/=1,num/=2(一共循环2次,即j次)
结果为6,那么第4行,第2列打印6。
==========
转换成代码:
int num=1;
for(int n=0;n<j;n++) {
sum*=i-n;
}
for(int n=0;n<j;n++) {
sum/=(n+1);
}
==========
这两个循环可以合成一个循环,就是在每次循环时乘以一个数,然后再除以一个数。
int num = 1;
for(int k = 0; k < j; k++)
{
num = num * (i - k) / (k + 1);
}
计算出数值后打印该值
System.out.println(sum);
===========
还有什么不明白,可以百度Hi我。
相似回答