求一个杨辉三角形的代码(不用面向对象的前提下) 新手报到,请多指教!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也是新手,方法仅供参考,思想应该没有问题!!~~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(""); } }} 原来在 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 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()应该是一个帮助文档里面的.但是不太清楚里面所表达的意思!!不过还是谢谢大家的帮忙! IllegalArgumentException 是一个内置的运行期异常,也就是在传入的参数非法时抛出异常。何时为参数非法,需要手工进行判断,比如我在 2 楼的当传入的参数小于 1 或者大于 30 时就抛出这个异常,下面的也就不做了。 这个问题 我也很不懂; 果子这个程序,我看不大懂,可能是一些算法的问题, 你为什么要 求 最大数字的长度还有* 阶乘计算 ???? long result = start > 0 ? start : 1L; while(num > start) { result *= num--; }一连串的 问号?我估计你可能要解释 得 比较详细 大家才能懂了 呵呵,计算最大数字长度是为了能让位数较少的数字前面加上一定数量的空格啊。比如说 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。一行中最大的数字值行该行的当中呵呵,知道为什么这里要使用阶乘了么? 听了以上 解释明白了 一些;但是还是有些问题 无法解决:看这里: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);这个里面是什么呀? swing如何刷新系统 帮我调一个小程序 JDK里的java调用Vc写的DLL,其它都正常,就Vc里的定时器不工作? 这结果为什么---7.0<0x8000000 ? [条形码问题] 图书馆的书丢了,知道该书的隶书号,能不能制造一个相同的条形码 JDBC连接错误问题 请教各位高手一个简单问题,急 如何用IP连接数据库,不用DNS! 请大家看看我的这段代码那里错了!!!!! 有Sock方面的高手吗? java SWT怎么遍历一个按钮。 一个问题
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("");
}
}
}
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
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()应该是一个帮助文档里面的.
但是不太清楚里面所表达的意思!!
不过还是谢谢大家的帮忙!
抛出这个异常,下面的也就不做了。
while(num > start) {
result *= num--;
}一连串的 问号?我估计你可能要解释 得 比较详细 大家才能懂了
如果是 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。一行中最大的数字值行该行的当中呵呵,知道为什么这里要使用阶乘了么?
但是还是有些问题 无法解决:
看这里:
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);
这个里面是什么呀?