day07作业---------二维数组 & 递归
作业:
1. 输入一个 m*n的矩阵和一个n*p的矩阵,并初始化, 要求打印出两个矩阵的乘积(两个矩阵数据,分别存储在两个二维数组中)
2. 一个楼梯有n (n >= 1)级,每次走1级或两级,请问从1级台阶走到第n级台阶一共有多少种走法(假设一开始站在第0级台阶上)
3. 计算n条直线最多能把平面分成多少部分? n >= 1
4. 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第i(i的取值范围为[1, 10])天的桃子个数?
答案:
1.
1 package com.day007; 2 3 import java.util.Scanner; 4 5 /* 6 * 1. 输入一个 m*n的矩阵和一个n*p的矩阵,并初始化, 7 * 要求打印出两个矩阵的乘积(两个矩阵数据,分别存储在两个二维数组中) 8 * 9 * 分析: 10 * 1.一个 m*n的矩阵A和一个n*p的矩阵B相乘,得到一个m*p的矩阵C 11 * 2.C矩阵中Cij位置的值为A矩阵第i行元素与B矩阵第j列元素对应相乘,再取乘积之和 12 */ 13 public class Demo1 { 14 public static void main(String[] args) { 15 System.out.println("求m行n列的矩阵A和n行p列的矩阵B的乘积矩阵C"); 16 Scanner sc = new Scanner(System.in); 17 System.out.println("请输入矩阵A的行数m:"); 18 int m = sc.nextInt(); 19 System.out.println("请输入矩阵A的列数n:"); 20 int n = sc.nextInt(); 21 System.out.println("请输入矩阵B的列数p:"); 22 int p = sc.nextInt(); 23 24 int arr1[][] = new int[m][n];//矩阵为m*n的矩阵 25 int arr2[][] = new int[n][p];//矩阵为n*p的矩阵 26 27 //为m*n矩阵传入初始值 28 System.out.println("请为矩阵A赋初值:"); 29 for(int i = 0; i < m; i++) { 30 for(int j = 0; j < n; j++) { 31 arr1[i][j]=sc.nextInt();//向矩阵arr1中输入数据 32 } 33 } 34 35 //为n*p矩阵传入初始值 36 System.out.println("请为矩阵B赋初值:"); 37 for(int i = 0; i < m; i++) { 38 for(int j = 0; j < n; j++) { 39 arr2[i][j]=sc.nextInt();//向矩阵arr2中输入数据 40 } 41 } 42 sc.close(); 43 //两数组相乘 44 int[][] arr = new int[m][p];//创建矩阵用于存放乘积 45 for(int i = 0; i< m; i++) {//矩阵行控制量 46 for(int j = 0; j< p; j++) {//矩阵列控制量 47 for(int k = 0; k < n; k++) {//矩阵arr的列 48 arr[i][j] = arr1[i][k]+arr2[k][j];//给矩阵arr元素赋值 49 } 50 } 51 } 52 53 //输出乘积矩阵arr 54 System.out.println("乘积矩阵C为:"); 55 for(int i = 0; i < m; i++) { 56 for(int j = 0; j < p; j++) { 57 System.out.print(arr[i][j]+" "); 58 } 59 System.out.println(); 60 } 61 } 62 } 63
输出结果:
2.
1 package com.day007; 2 3 import java.util.Scanner; 4 5 /* 6 * 2. 一个楼梯有n (n >= 1)级,每次走1级或两级, 7 * 请问从1级台阶走到第n级台阶一共有多少种走法(假设一开始站在第0级台阶上) 8 * 9 * 分析:假设有n级台阶,m种走法,则 10 * 台阶数 1 2 3 4 5 ... n 11 * 走法m -- 1 2 3 5 8 ... f(n-1)+f(n-2) 12 */ 13 public class Demo2 { 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in); 16 int n = sc.nextInt(); 17 int m = method(n); 18 System.out.println("当有"+n+"阶台阶时,一共有"+m+"种走法。"); 19 sc.close(); 20 } 21 22 public static int method(int n) { 23 if(n == 1) { 24 return 1; 25 } 26 if(n == 2) { 27 return 2; 28 } 29 return method(n-1) + method(n-2); 30 } 31 }
运行结果:
3.
1 package com.day007; 2 3 import java.util.Scanner; 4 5 /* 6 * 3. 计算n条直线最多能把平面分成多少部分? n >= 1 7 * 分析: 8 * 当有n条直线时,平面分成m面 9 * 直线 1 2 3 4 5 ... n 10 * 面f(n) 2 4 7 11 16 ... f(n-1)+n 11 * 数学计算公式为:n*(n+1)/2 +1 12 */ 13 public class Demo3 { 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in); 16 int n = sc.nextInt();//当有N条直线时 17 int m = parts(n);//把平面分成M面 18 System.out.println("当有"+n+"条直线时,把平面分成"+ m +"面"); 19 sc.close(); 20 } 21 public static int parts(int n) { 22 if(n == 1) { 23 return 2; 24 } 25 return parts(n-1)+n; 26 } 27 28 }
运行结果:
4.
1 package com.day007; 2 3 import java.util.Scanner; 4 5 /* 6 * 4. 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 7 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个; 8 以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。 9 问第i(i的取值范围为[1, 10])天的桃子个数? 10 11 分析:第i天,有桃子m个 12 天数i 10 9 8 7 ... i 13 桃子数m 1 4 10 22 ... 2*f(i+1)+2 14 */ 15 public class Demo4 { 16 public static void main(String[] args) { 17 System.out.println("请输入天数,取值范围为1到10:"); 18 Scanner sc = new Scanner(System.in); 19 int day = sc.nextInt(); 20 int ge = sum(day); 21 System.out.println("第"+day+"天的桃子个数为"+ge); 22 sc.close(); 23 } 24 25 public static int sum(int day) { 26 if(day == 10) { 27 return 1; 28 } 29 return 2*sum(day+1)+2; 30 } 31 32 }
运行结果: