您的位置:首页 > 编程语言

【编程马拉松】【010-杨辉三角】

2016-06-10 09:40 363 查看

【编程马拉松算法目录>>>】

【010-杨辉三角】【工程下载>>>】

1 题目描述

  1

  1 1

  1 2 1

  1 3 3 1

  1 4 6 4 1

  1 5 10 10 5 1

  上面的图形熟悉吗?它就是我们中学时候学过的杨辉三角。

1.1 输入描述:

  输入数据包含多组测试数据。

  每组测试数据的输入只有一个正整数n(1≤n≤128),表示将要输出的杨辉三角的层数。

  输入以0结束

1.2 输出描述:

  对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。

1.3 输入例子:

2
3
0


1.4 输出例子:

1
1 1

1
1 1
1 2 1


2 解题思路

2.1解法一

  假设杨辉三角的使用一个二维数组a进行表示。a[i][j]表示第i+1行第j+1列元素的值,有公式:

a[i][j]={1a[i−1][j−1]+a[i−1][j]j=0 or j=i0<j<ia[i][j]=\begin{cases}
1&j=0 or j=i\\
a[i-1][j-1]+a[i-1][j]&0

2.2解法二

  将杨辉三角使用一个一维数组a表示,从下标0开始,杨辉三角第i行第j列个元素对应用到数组a的下标为x(i,j):则

x(i,j)=(∑k=1i−1k)+j−1 (j≥1 and i≥j)x(i,j)=\left ( \sum_{k=1}^{i-1}k \right )+j-1 (j≥1 and i≥j)x(i,j)=i(i−1)2+j−1x(i,j)=\frac{i(i-1)}{2}+j-1

  得

a[x(i,j)]={1a[x(i−1,j−1)][x(i−1,j)]j=1 or j=i1<j<ia[x(i,j)]=
\begin{cases}
1&j=1 or j=i\\
a[x(i-1,j-1)][x(i-1,j)]&1

3 算法实现

import java.math.BigInteger;
import java.util.Scanner;

/**
* Author: 王俊超
* Time: 2016-05-09 10:53
* CSDN: http://blog.csdn.net/derrantcm * Github: https://github.com/Wang-Jun-Chao * Declaration: All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNext()) {
int num = scanner.nextInt();

if (num == 0) {
break;
}
System.out.println(triangle2(num));
}

scanner.close();
}

/**
* 【解法一】
* 计算杨辉三角
*
* @param n 杨辉三角的行数
* @return 杨辉三角
*/
private static String triangle(int n) {

if (n < 1) {
throw new IllegalArgumentException("参数必须是正整数");
}

if (n == 1) {
return "1\n";
} else if (n == 2) {
return "1\n1 1\n";
}

StringBuilder b = new StringBuilder();

BigInteger[][] t = new BigInteger

;
for (int i = 0; i < t.length; i++) {
t[i] = new BigInteger
;
}

for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || i == j) {
t[i][j] = new BigInteger("1");
} else {
t[i][j] = t[i - 1][j - 1].add(t[i - 1][j]);
}
b.append(t[i][j]).append(' ');
}

b.setCharAt(b.length() - 1, '\n');
}

return b.toString();
}

/**
* 【解法二】
* 计算杨辉三角
*
* @param n 杨辉三角的行数
* @return 杨辉三角
*/
private static String triangle2(int n) {
if (n < 1) {
throw new IllegalArgumentException("参数必须是正整数");
}

BigInteger[] t = new BigInteger[n * (n + 1) / 2];
StringBuilder b = new StringBuilder();

for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {

// 第i行第一个元素的下标是: (i - 1) * i / 2
// 第i行第j个元素的下标是:(i - 1) * i / 2 + j - 1
int idx = (i - 1) * i / 2 + j - 1;

if (j == 1 || i == j) {
t[idx] = BigInteger.ONE;
} else {

// 第i-1行第一个元素的下标是: (i - 2) * (i - 1) / 2
int x = (i - 2) * (i - 1) / 2 + j - 1;
int y = (i - 2) * (i - 1) / 2 + j - 2;
t[idx] = t[x].add(t[y]);
}

b.append(t[idx].toString()).append(' ');
}

b.setCharAt(b.length() - 1, '\n');
}

return b.toString();
}
}


4 测试结果



5 其它信息

因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: