算法训练 4-1打印下述图形
时间限制:1.0s 内存限制:256.0MB
问题描述
使用循环结构打印下述图形,打印行数n由用户输入。打印空格时使用"%s"格式,向printf函数传递只包含一个或多个空格的字符串" ",下同。
样例输入
一个满足题目要求的输入范例。
例:
5
例:
5
样例输出
与上面的样例输入对应的输出。
例:
例:
数据规模和约定
输入数据中每一个数的范围。
例:0<n<20。
例:0<n<20。
题目解析:
本道题共两种思路,由于 n 的范围很小(0 < n <20),所以两种思路就运行时间、占用内存和复杂度并无优劣之分。
(1)用循环语句分别控制行、每行开始的空格和每行的 *。
比如,n = 3
表 1.1
利用 i ( i 从 1 开始)来控制行,因此可以推出空格数 space 与 行数 n 和控制行变量 i 的关系: space = n - i ,* 数 asterisk 与控制行变量 i 的关系: asterisk = 2 * i - 1。
(2)将图形存放在 String 类型的数组中,数组初始化为空。如图 1.1 所示,找出中心列号 center = n - 1,每 i 行都是在中心列的左右两边加 i 个 *,最后将数组输出即可。
示例代码1:
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int n = sc.nextInt(); 7 8 for(int i = 1; i <= n; i++){ //控制行 9 for(int space = n-i ; space >= 1; space--){ //控制每行前边的空格 10 System.out.print(" "); 11 } 12 for(int asterisk = 1 ; asterisk <= 2 * i - 1; asterisk++){ //控制每行的 * 13 System.out.print("*"); 14 } 15 System.out.println(); 16 } 17 } 18 }
示例代码2:
1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner sc = new Scanner(System.in); 7 int n = sc.nextInt(); 8 9 String[][] triangle = new String[n][2*n-1]; //创建一个数组,初始化为空 10 for(int i = 0; i < n; i++) { 11 for(int j = 0; j < 2*n-1; j++) { 12 triangle[i][j] = " "; 13 } 14 } 15 16 int center = n-1; //中心列号 17 for(int i = 0; i < n; i++) { //控制行 18 for(int j = 0; j <= i ; j++) { //每行在中心左右两边增加 i 个 * 19 triangle[i][center-j] = "*"; 20 triangle[i][center+j] = "*"; 21 } 22 } 23 //输出图形 24 for(int i = 0; i < n; i++) { 25 for(int j = 0; j < 2*n-1; j++) { 26 System.out.print(triangle[i][j]); 27 } 28 System.out.print(" "); 29 } 30 } 31 }