根据输入行数,打印出杨辉三角形。
1.首先分析杨辉三角
两侧全部都是1,中间的数等于其上边两数之和。如果在二维数组中,则如下:
2.可以通过二维数组来处理方阵,一个双重循环就能实现,外循环控制行数,内循环控制列来完成方阵内数字的计算和存储。
程序编写
a.首先编写出程序框架
import java.util.Scanner;
public class First
{
public static void main(String[] args)
{
System.out.print("请输入行数:");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt(); //键盘接收行数
int[][] arr = getTriangle(num); //得到杨辉三角
print(arr); //打印杨辉三角
}
}
b.然后得到杨辉三角
由前面的问题分析可知,用二维数组计算存储杨辉三角,杨辉三角竖边、斜边都为1,可以先赋值,然后再给中间元素赋值,当前位置的值等于它的上方数和左上角上的数之和。
程序代码如下:
private static int[][] getTriangle(int num)
{
int[][] ary = new int[num][num]; //用二维数组存储
for(int i = 0; i < ary.length; i++) //竖边、斜边置1
{
ary[i][0] = 1;
ary[i][i] = 1;
}
for(int i = 1; i < ary.length; i++) //外循环控制行数
{
for(int j = 1; j <= i; j++) //内循环控制列
{
//里面部分,等于当前位置的上方和左上角之和
ary[i][j] = ary[i-1][j-1] + ary[i-1][j];
}
}
return ary;
}
c.
打印杨辉三角
杨辉三角保存在二维数组中,通过一个双重循环就可以打印出来,但是要注意的是,不需要把所有元素都打印出来,内循环列的控制要小于等于当前行数。
程序代码如下:
private static void print(int[][] ary)
{
for(int i=0;i<ary.length;i++) //外循环控制行
{
for(int j=0;j<=i;j++) //内循环控制列
{
System.out.printf(" %-3d", ary[i][j]);
}
System.out.println(); //换行
}
}
附完整程序:
import java.util.*;
public class First
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in); //获取控制台输入对象
System.out.print("请输入行号: ");
int m = in.nextInt(); //从键盘接收输入
int n=2*m-1; //列元素个数
int arr[][]=new int[m][n];
for(int i=0;i<m;i++) //外循环控制行
{
for(int j=0;j<n;j++) //内循环控制列
{
if(j<(m-i-1)||(j>=(m+i))) //输出等腰三角形两边空格
System.out.print(" ");
else if((j==(m-i-1))||(j==(m+i-1))) //计算并输出等腰三角形两个腰
{
arr[i][j]=1;
System.out.printf("%-3d",arr[i][j]);
}
else if((i+j)%2==0&&m%2==0||(i+j)%2==1&&m%2==1)//中间默认数字0用空格替换
System.out.print(" ");
else //计算并输出中间数字
{
arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];
System.out.printf("%-3d",arr[i][j]);
}
}
System.out.println(); //输出换行
}
}
}
bat版杨辉三角实现
@echo off&color 0e
setlocal enabledelayedexpansion
mode con: cols=130 lines=130
:top
cls
::set /p in=请输入行数:
set in=23&set ab=1&set var=64
if "%in%"=="" goto top
if %in% geq 35 goto top
if %in% leq 0 goto top
echo %in%|findstr /r "^[0-9][0-9]*$">nul 2>nul||goto top
set str=1
for /l %%i in (1,1,%in%) do (
set num=
set num2=0
for %%a in (!str!) do (
set /a num2+=1
if !num2!==1 set "str1="
set /a num1=%%a+num
set "str1=!str1! !num1!"
set num=%%a
)
call :lis "!str1:~1!"
set "str=!str1! 0"
)
rem 再输出个倒 金字塔 玩玩。
for /l %%a in (22 -1 1) do echo !nam%%a!
for /l %%i in (1 1 3) do (
for %%a in (a b c d e f) do (
color 0%%a
ping/n 2 127.1>nul
))
exit
:lis
set max=%~1
for /l %%a in (0 1 300) do (
if not "!max:~%%a,1!"=="" set /a ci+=1
)
set /a ki=var-ci/2
for /l %%a in (1 1 !ki!) do set kg= !kg!
echo !kg!!max!
set nam!ab!=!kg!!max!
set /a ab+=1
set ci=0&set kg=
goto :eof