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 }

运行结果:

 

posted @ 2020-04-15 16:44  dust--  阅读(252)  评论(0编辑  收藏  举报