JAVA基础练习:应用数组实现杨辉三角输出3.5
应用数组实现杨辉三角输出3.5
一、问题描述
分别采用一维数组和二维数组输出杨辉三角,并且对比其不同之处
二、数学分析
杨辉三角的基本规律是,第n行有n个数字,n个数数字中首尾都是1,其余数字等于其两肩之和;
若采用一维数组的方式输出,则是每次解决一行的问题并加以循环辅助;
若采用二维数组的方式,则是可以把整个三角阵记录下来;
三、伪代码
获取需要输出n=多少的杨辉三角;
如果n=1,直接输出;
如果n=2,直接输出;//因为此时没有两肩,规律性不强,单独处理更好
如果n>=3,进入循环设置一个足够大的长度为n一维数组a,里面为{1,1}
设置一个同样大小的存储数组b=a;
for(int i=2;i<=n;i++)//n>=2,i为行数字
{ a[0]=1 a[i]=1for(j=2;j<i;j++){a[j]=b[j-1]+b[j] //更新数据数列}for//循环输出适合数量的空格{输出(2n-1)-(2i-1)/2个空格;System.out.printf("\n");}for//循环输出数字{输出数组中的一个数字输出空格if是最后一个,则不用输出空格}换行更新数组b}
}
四、一维数组实现代码
package try1;
import java.util.*;//用一维数组实现杨辉三角
public class YangHui {public static void main(String[] args)
{int n;Scanner reader= new Scanner(System.in);System.out.println("请输入杨辉三角的行数n");//获取行数nn= reader.nextInt();int []a =new int[n];//a数组存储即将需要输出的数字列int []b = new int[n];//b数组为备份数组//只有1、2行的时候直接输出if(n == 1){System.out.println(n);}else if(n == 2){System.out.printf(" %3d ",1);//采用格式化输出以便对齐System.out.printf("\n");System.out.printf("%3d %3d",1,1);}//其它的一般情况的输出else {for(int m=1;m<=n-2;m++){System.out.print(" ");}System.out.printf(" %3d \n",1);for(int m=1;m<=n-2;m++){System.out.printf(" ");}System.out.printf("%3d %3d\n",1,1);a[0]=1;a[1]=1;System.arraycopy(a, 0, b, 0, a.length);for(int i=3;i <=n;i++)//i为行数{a[0]=1;a[i-1]=1;//更新数组for(int j=1;j <i-1;j++){a[j]=b[j-1]+b[j];//两肩之和,j为除了开头结尾之后的列数}//输出前半段的空格for(int k=1;k <= (n-i);k++)//k为空格数{System.out.print(" "); }//输出中间数字和空格for(int j=0;j < i;j++)//j为列数{System.out.printf("%3d",a[j]);if(j < i-1){System.out.print(" ");}}//换行System.out.printf("\n");System.arraycopy(a, 0, b, 0, a.length);//使用数组复制更新数组b}}
}
}
1. 可能的错误
直接利用数组名进行数组之间的赋值
int []a =new int[n];
int []b = new int[n];
b=a;
数组的本质为存储空间逻辑地址的首地址,是引用数据类型的变量,直接用等号会直接导致a和b指向同一个存储空间,进而使得两个数组其实为同一个数组,静态的操作不可以实现想要的两个不同的数组但是它们里面的值相等的目的。
解决方法1:
使用循环去对数组中的元素进行逐个静态赋值
for(int i=0;i <= n;i++) {b[i]=a[i]; }
解决方法2:
使用System.arraycopy
System.arraycopy(a, 0, b, 0, n); //括号内的参数分别是(原始数组,开始复制的位置,目的数组,开始粘贴的位置,复制的长度)
2.可能遇到的细节优化
当行数较多的时候,产生三位数/四位数的时候,不能够完美对齐
解决方法:使用格式化输出
辨析print/println/printf三者的区别:
1)print vs println:前者直接输出,后者输出之后自动换行
2)print vs printf:前者直接输出有不稳定性,后者可以控制格式输出
如何使用printf(同c中的使用一样)
一般使用格式:
printf("格式化的字符串",占位符处的具体变量);//e.g. printf("%3d",2);//用三个位置来输出一个整数2 printf(%m.ns", str);//输出固定长度的字符串,m为输出的固定宽度,n为输出的字符串的前n位 printf("%m.nf")//m为小数的默认宽度,n为小数保留多少位数,如果n>m,按照长的那一个输出
演示
else if(n == 2){System.out.printf(" %3d ",1);System.out.printf("\n");System.out.printf("%3d %3d",1,1);//设置不论是空格还是数字,都是三个单位的宽度}
所以输出空格的时候应该每次输出三个,而输出数字的时候用%3d作为占位符
- 输出结果
就很符合强迫症的需求了,对齐的杠杠的。?
五、二维数组实现代码
package try1;
import java.util.*;//用二维数组实现杨辉三角
public class Yanghui2 {public static void main(String[] args) {int n;Scanner reader= new Scanner(System.in);System.out.println("请输入杨辉三角的行数n");n= reader.nextInt();int [][]arr =new int[n][n];//创建一个n*n的矩阵来放杨辉三角的数字//将比较特殊的第一二行直接输出if(n == 1){System.out.println(n);}else if(n == 2){System.out.printf(" %3d ",1);System.out.printf("\n");System.out.printf("%3d %3d",1,1);}else {for(int m=1;m<=n-2;m++){System.out.print(" ");}System.out.printf(" %3d \n",1);for(int m=1;m<=n-2;m++){System.out.printf(" ");}System.out.printf("%3d %3d\n",1,1);arr[0][0]=1;arr[1][0]=1;arr[1][1]=1;//将第一第二行导入数组中for(int i=3;i <=n;i++)//i为行数{arr[i-1][0]=1;arr[i-1][i-1]=1;//补充数组完毕for(int j=1;j <i-1;j++){arr[i-1][j]=arr[i-2][j-1]+arr[i-2][j];//两肩之和,j为除了开头结尾之后的列数}}for(int i=3;i<=n;i++)//i代表行数{//输出前半段的空格for(int k=1;k <= (n-i);k++)//k为空格数{System.out.print(" "); }//输出中间数字和空格for(int j=0;j < i;j++)//j为列数{System.out.printf("%3d",arr[i-1][j]);if(j < i-1){System.out.print(" ");}}//换行System.out.printf("\n");}}}
}
修改的地方
1.创建数组的时候只是用了一条式子
int [][]arr =new int[n][n];
2.不需要逐行输出,而是先将整个矩阵补充完毕再统一输出
arr[0][0]=1;arr[1][0]=1;arr[1][1]=1;//将第一第二行导入数组中for(int i=3;i <=n;i++)//i为行数{arr[i-1][0]=1;arr[i-1][i-1]=1;//补充数组完全for(int j=1;j <i-1;j++){arr[i-1][j]=arr[i-2][j-1]+arr[i-2][j];//两肩之和,j为除了开头结尾之后的列数}
3.用双重循环来输出数组和中间空格,同样的是三个单位的宽度
for(int i=3;i<=n;i++)//i代表行数{//输出前半段的空格for(int k=1;k <= (n-i);k++)//k为空格数{System.out.print(" "); }//输出中间数字和空格for(int j=0;j < i;j++)//j为列数{System.out.printf("%3d",arr[i-1][j]);if(j < i-1){System.out.print(" ");} }//换行System.out.printf("\n");}
4.不需要纠结于数组不可静态赋值的存储问题,直接完成
`
JAVA基础练习:应用数组实现杨辉三角输出3.5相关推荐
- java实现a3打印_javase 打印杨辉三角
下面用java写一个打印10行杨辉三角的程序,其中用到的是二维数组 package com.test001; //本实例打印10行杨辉三角 /* * 1 * 1 1 * 1 2 1 * 1 3 3 1 ...
- 利用一维数组打印杨辉三角
//利用一维数组打印杨辉三角 void main() {int A[MAX]={1};//A[0]=1 其他都为0int N;//杨辉三角层数int n,i,space;printf("请指 ...
- 二维数组打印杨辉三角
二维数组打印杨辉三角 让我们用C语言来打印出高中让我们头疼的杨辉三角,话不多说,上代码 我们先创建一个二维数组,并初始化为0,定义两个整形变量i,j控制行数和列数i,再定义一个n用来接受打印的行数 i ...
- 【Java】 杨辉三角 二维数组打印杨辉三角
Tips 打印三角的操作 : 每行打印前预留空格 打印指定数量的星号后换行 重复循环打印直至完成所有打印结果 杨辉三角: 三角规律空格最大对称值为 5 大于 5 则会变形 三角规律为当前值为上一个值加 ...
- php数组写杨辉三角java_用java实现杨辉三角的示例代码
之前有学弟问过我一道java的面试题,题目不算难.用java实现杨辉三角.我花了点时间整理了一下,发现挺有意思的,于是想写下来分享一下.在写代码之前,我们先理清下面两个问题. 什么是杨辉三角 杨辉三角 ...
- 输出素数和排序后的数组和杨辉三角
输出素数 package 实验包; import java.util.*; public class found_prime_number { ; public static void main( ...
- C语言一维数组实现杨辉三角,一维数组实现杨辉三角
杨辉三角 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- java实现杨辉三角形,蓝桥杯杨辉三角
杨辉三角结合图片分析是很容易理解的,特点就是三角形中的每个数字等于它上面的数字和他左上的数字相加. 图片: 代码如下: int [][] a=new int [8][8];//定义一个8行8列二维数组 ...
- C语言二维数组实现杨辉三角
上次发了一个课程设计,下面准备把自己写过的一些程序发出来供大家学习,毕竟在C站上Ctrl C过这么多次... 杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1 ...
最新文章
- NASA将天文数据转换为音频,来听听银河系的声音!
- [DruidAbstractDataSource] maxIdle is deprecated
- 错误:java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory 解决方案...
- SpringBoot集成Redis实现排行榜
- AWS load balancer
- codeforces1437 E. Make It Increasing——最长上升子序列
- TensorFlow 中三种启动图用法
- PC端动态视频背景引导页(非自适应)
- python语言程序设计实验教程答案实验三_20182204 实验三《Python程序设计》实验报告...
- Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式
- 拓端tecdat|matlab使用Copula仿真优化市场风险数据VaR分析
- Eclipse配置Tomcat详细教学|Eclipse和Tomcat的下载安装
- 2021年下软考中级软件设计师经验分享通过技巧
- Orz这个词的复杂意思[z]
- 编译原理 最左推导和最右推导
- java游戏怎么导入jme3,java - JME:将带有纹理的Cinema 4d模型导入jMonkey Projekt - 堆栈内存溢出...
- 跟踪信号发生器如何产生宽频带信号?
- 花千骨歌曲大全 附简谱
- 推荐一款Mac上好用的Markdown编辑器
- A. Chess Placing