【编程马拉松】【010-杨辉三角】
2016-06-10 09:40
363 查看
【编程马拉松算法目录>>>】
【010-杨辉三角】【工程下载>>>】
1 题目描述
11 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上进行【下载>>>】。相关文章推荐
- java 调试
- C语言变量的使用
- C++ c++初识
- Java基础整理(二)
- python 系统级错误代码
- C语言基础学习
- 什么是java同步
- QT移植中的一些问题
- C++11智能指针
- Java EE 中 JSF找不到Bean 的属性
- 《梦断代码》阅读笔记03
- java可视化编程
- QT编程中的-qws
- python 生成器总结
- 开启FTP服务器(配置)
- 运用路由约束 使用属性路由 精通ASP-NET-MVC-5-弗瑞曼
- Java千百问_08JDK详解(004)_jdk基础扩展类库都有什么
- Java 开发环境配置
- C++复习3.继承的相关概念
- 使用Route Prefix 使用属性路由 精通ASP-NET-MVC-5-弗瑞曼