我们在编程练习初始阶段总会碰到这样的算法题,输出一个怎样怎样的图形,达到什么样的效果,其实这样的题都会有一个固定的思想。
首先要发现其中隐藏的规律,既然是输出图形,怎么摆放一定是有规律的,要不然各种乱,一点规律没有,这样的题就一点意义都没有了。所以拿到这种算法题,不是拿过来就敲代码,要根据观察得来的规律,脑中大致要有一个思路,第一步实现什么,第二步实现什么,这是很重要的,同时这也是很多初学者编程时候最容易犯的错误!
下面我们用杨辉三角形和金字塔来进行举例:
-
杨辉三角形
- 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1 - 大家可以自己画一下观察一下规律(有人问为啥不是等腰三角形形状?那个输出的时候控制一下就好了!)
- 首先,最明显的是最外层全是1;
- 之后呢,从第三行开始每一个数是上一行本列和前一列的的数之和,不过此时要注意就是第一列和最后一列除外。
- 此时,大家再观察一下,还有没有其它的规律呢?
- 没有的话,此时还不是直接敲代码哦,别心急,想一下如何是实现?这对初学者尤为重要,思路清晰事半功倍!
- 编程开始的第一步,你一定是要把最外层的1放进去的,因为这是最明显的。那么放在哪里?观察这个杨辉三角,每个数其实就像在一个棋盘上面,每个都对齐着,有行有列,那我们就可以用一个二维数组来存储每个数据。
- 第二步:此时最外层1放进去了,便可以实现第二哥规律了:从第三行开始每一个数是上一行本列和前一列的的数之和,此时数组正好可以用下标来表示行和列。
- 第二步完成时,规律实现完,也就是把所有数按照规律放在了里面。
- 最后一步,打印输出。
- 1
import java.util.Scanner;
public class c {
public static void main(String[] args) {
System.out.println("请输入所要显示杨辉三角的行数:");
Scanner in = new Scanner(System.in);
int Line = Integer.parseInt(in.nextLine());
int[][] arr = new int[Line][Line];
for(int i = 0; i < arr.length; i++){
arr[i][0] = 1;
arr[i][i] = 1;
}
for(int i = 2; i < arr.length; i++){
for(int j = 1; j <= i-1 ; j++){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
for(int i = 0; i < arr.length ; i++){
for(int j = 0; j <= i ; j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
-
金字塔
- (我是直接截取的图片,大家可以画一下,这样有助于大家了解这道题。)
- 大家先画一下这个三角形金子塔,根据上面的杨辉三角,来做一下道图形输出题。
- 同样,首先第一步不是直接敲代码,而是找出隐藏规律!
- 第一步,观察出最明显的,也就是星号了吧。继续观察每一行的星号,此时相信你已经不难发现星号与行数的关系!恭喜你,第一个规律就找到了。
- 第二步,整个金字塔除了这些还有啥?没啥了啊,是不是?不是的,那不还有空格嘛?要不然你怎么将星号放在中间的位置啊?继续观察每一行的空格,此时你就不难发现空格和行数的关系!
- 此时整个金字塔分析完毕,整理可得:
- 空格:等于行数减一
- 星号:等于2倍行数减一
- 此时还不是直接敲代码哦,别心急,想一下如何是实现?
- 很明显,输出的时候一定是先输出空格,之后再输出星号,对吧,要不然怎么可能让星号直接放到中间。
- 输出空格,星号之后第一行就结束了,第二行同样,第三行也同样......不知道你有没有感觉但,如此有规律我们是不是就可以想到用了循环啦。一定是先限制行数,再限制空格,最后再限制星号!
- 想到这,就可以行动啦!
-
import java.util.Scanner; public class ptOne { public static void main(String[] args) { System.out.println("请输入要打印的金字塔行号:"); Scanner in = new Scanner(System.in); int Line = in.nextInt(); for(int i = 1;i <= Line; i++){ // 控制行数 //先输出空格 for(int j = 0; j < Line-i;j++){ //控制空格 System.out.print(" "); } //在输出星号 for(int t = 0; t < 2*i-1; t++){ //控制星号 System.out.print("*"); } System.out. } System.out.println(); } } }
到这,你是不是已经明白了呢?不妨自己编一下倒三角和菱形来检测一下自己吧!!要记住:一定要多敲代码,而不是看懂了就ok了哦!
//倒三角 import java.util.Scanner; public class b { public static void main(String[] args) { System.out.println("请输入要打印的金字塔行号:"); Scanner in = new Scanner(System.in); int Line = in.nextInt(); //行数 for(int i = Line; i > 0; i--){ for(int j = 0; j < Line - i ;j++){ System.out.print(" "); } for(int t = 0;t <2*i-1;t++){ System.out.print("*"); } System.out.println(); } } } //菱形 import java.util.Scanner; public class b { public static void main(String[] args) { System.out.println("请输入要打印的金字塔行号:"); Scanner in = new Scanner(System.in); int Line = in.nextInt(); for(int i = 1;i <= Line; i++){ for(int j = 0; j < Line-i;j++){ System.out.print(" "); } for(int t = 0; t < 2*i-1; t++){ System.out.print("*"); } System.out.println(" "); } //行数 for(int i = Line; i > 0; i--){ for(int j = 0; j < Line - i ;j++){ System.out.print(" "); } for(int t = 0;t <2*i-1;t++){ System.out.print("*"); } System.out.println(); } } }