Java 练习(二)
- 从键盘接收两个数据,一个代表鸡和兔子的头数,一个代表,鸡和兔子的腿数。编写一个程序,计算有多少只鸡,多少只兔子。如果无解,则输出:No solution.
1input:
235
394
4
5output:
6rabbit: 12 chicken: 23
7
8input:
920
1040
11
12output:
13only have chicken: 20
14
15input:
1615
1760
18
19output:
20only have rabbit: 15
21
22input:
2310
24100
25
26output:
27No solution
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int heads = scanner.nextInt();
7 int legs = scanner.nextInt();
8
9 if (legs == 4 * heads) {
10 System.out.println(String.format("Only %d rabbits.", heads));
11 } else if (legs == 2 * heads) {
12 System.out.println(String.format("Only %d chickens.", heads));
13 } else if (legs < 2 * heads || legs > 4 * heads | legs % 2 != 0) {
14 System.out.println("No soluion.");
15 } else {
16 int tmp = legs - heads * 2;
17 int rabbits = tmp / 2;
18 int chickens = heads - rabbits;
19 System.out.println(String.format("Rabbit: %d, Chicken: %d", rabbits, chickens));
20 }
21 }
22 }
23}
- 从键盘输入一个n的值,输出斐波那契数列的前n项。已知菲波那切数列的第一项和第二项都为1,其余项为:$f(n) = f(n-1) + f(n-2)$。
1input:
25
3
4output:
51 1 2 3 5
6
7input:
82
9
10output:
111 1
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int n = scanner.nextInt();
7 int a = 1, b = 1, c;
8 for (int i = 0; i < n; i++) {
9 if (i == 0 || i == 1) {
10 System.out.print(String.format("%d ", 1));
11 } else {
12 c = a + b;
13 System.out.print(String.format("%d ", c));
14 a = b;
15 b = c;
16 }
17 }
18 }
19 }
20}
- “今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二”问物几何。出自——孙子算经。
(有一个数,不知道是多少,但是它除3余数是2,除5余数是3,除7余数是2,问这个数是多少?)
请输出满足条件的最小正整数:
1public class Main {
2 public static void main(String[] args) {
3 boolean found = false;
4 int n = 2;
5 while (!found) {
6 n += 7;
7 if (n % 3 == 2 && n % 5 == 3) {
8 found = true;
9 }
10 }
11 System.out.println(n);
12 }
13}
- 奇数偶数贩售机。创建一个程序,判断输入数据是奇数还是偶数, 并输出该数字后连续的9个奇数或偶数,例如:输入2,返回"Even"并输出2 4 6 8 10 12 14 16 18
输入1,返回"Odd"并输出1 3 5 7 9 11 13 15 17
1input:
22
3
4output:
5Even
62 4 6 8 10 12 14 16 18
7
8input:
93
10
11output:
12Odd
133 5 7 9 11 13 15 17 19
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int n = scanner.nextInt();
7 System.out.println(n % 2 == 0 ? "Even" : "Odd");
8 for (int i = n; i < n + 17; i += 2) {
9 System.out.print(String.format("%d ", i));
10 }
11 }
12 }
13}
- 从键盘接收一个十进制整数,将十进制整数转换成二进制的形式输出。
1example:
2
3input:
411
5
6output:
71011
8
9input:
10100
11
12output:
131100100
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int n = scanner.nextInt();
7 String binary = Integer.toBinaryString(n); // 转化为二进制字符串
8 System.out.println(binary);
9 }
10 }
11}
- 编写一个程序,实现如下功能:从键盘读入一个数据n,输出一个n行n列的列表:对第i行和第j列位置,如果i和j的最大公约数是1(即i和j互素),则输出“*”号,其他位置输出“#”号。每打印n个符号后,换行输出新的符号。
1example:
2
3Input:
44
5output:
6****
7*#*#
8**#*
9*#*#
10
11input:
127
13output:
14*******
15*#*#*#*
16**#**#*
17*#*#*#*
18****#**
19*###*#*
20******#
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 StringBuilder row = new StringBuilder(""); // 创建 StringBuilder 构建字符串
6 try (Scanner scanner = new Scanner(System.in)) {
7 int n = scanner.nextInt();
8 for (int i = 1; i <= n; i++) {
9 for (int j = 1; j <= n; j++) {
10 if (gcd(i, j) == 1) {
11 row.append("*"); // StringBuilder 中追加字符串
12 } else {
13 row.append('#'); // StringBuilder 亦可以追加字符类型
14 }
15 }
16 System.out.println(row.toString()); // 转换为字符串输出
17 row.setLength(0); // 重置 StringBuilder
18 }
19 }
20 }
21
22 public static int gcd(int a, int b) {
23 return b == 0 ? a : gcd(b, a % b); // 三元表达式
24 }
25}
- 使用泰勒级数展开是计算正弦函数,展开式的最后一项精度不超过1e-10。其中正弦函数的展开式为:
$$ sinx=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\cdots $$
从键盘输入一个x(x为浮点数),计算x的正弦函数,结果保留小数位数2位(此题不要纠结,数位精度不对也可认为正确)。
1example:
2
3input:
40.5
5
6output:
70.48
8
9input:
101
11
12output:
130.84
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 double x = scanner.nextDouble();
7 int n = 1;
8 double sinx = 0.0;
9 int fac_n;
10
11 while (true) {
12 fac_n = 1;
13 for (int i = 1; i <= n; i++) {
14 fac_n *= i;
15 }
16 if (Math.pow(x, n) / fac_n > 1e-10) {
17 if ((n - 1) % 4 == 0) {
18 sinx += Math.pow(x, n) / fac_n;
19 } else {
20 sinx -= Math.pow(x, n) / fac_n;
21 }
22 } else {
23 break;
24 }
25 n += 2;
26 }
27
28 System.out.println(String.format("%.2f", sinx));
29 }
30 }
31}
- 从键盘读入一个数n,输出小于或等于n的所有素数的个数。
1example
2
3input:
4100
5
6output:
725
8
9input:
10200
11
12output:
1346
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int number = scanner.nextInt();
7 int result = 0;
8 for (int i = 2; i <= number; i++) {
9 if (isPrime(i)) {
10 result++;
11 }
12 }
13 System.out.println(result);
14 }
15 }
16
17 public static boolean isPrime(int n) {
18 if (n <= 1) {
19 return false;
20 } else {
21 for (int i = 2; i <= Math.sqrt(n); i++) {
22 if (n % i == 0) {
23 return false;
24 }
25 }
26 return true;
27 }
28 }
29}
- 从键盘输入一个正整数n,输出小于n的所有与其互素的数的个数。(即求 $\phi(n)$ 的值)。例如:与10互素的数为:9,7,3,1一共4个。
1example:
2
3input:
410
5
6output:
74
8
9input:
109
11
12output:
136
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int n = scanner.nextInt();
7 int result = 0;
8 for (int i = 1; i < n; i++) {
9 if (gcd(n, i) == 1) {
10 result++;
11 }
12 }
13 System.out.println(result);
14 }
15 }
16
17 public static int gcd(int a, int b) {
18 return b == 0 ? a : gcd(b, a % b);
19 }
20}
- 从键盘接受一个正整数n,生成一个由1~n的数组。输出一个数组,数组中的每个元素为与前面数组中小于自身的互素的数的个数。
1example:
2
3input:
410
5
6output:
7[0, 1, 2, 2, 4, 2, 6, 4, 6, 4]
8
9input:
1020
11
12output:
13[0, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8]
1import java.util.Scanner;
2import java.util.ArrayList; // 导入 ArrayList 类
3
4public class Main {
5 public static void main(String[] args) {
6 try (Scanner scanner = new Scanner(System.in)) {
7 int n = scanner.nextInt();
8 ArrayList<Integer> result = new ArrayList<>(); // 利用 ArrayList 存储结果
9 for (int i = 1; i <= n; i++) {
10 result.add(coprimeCount(i)); // 向 ArrayList 追加结果
11 }
12 System.out.println(result);
13 }
14 }
15
16 public static int coprimeCount(int n) {
17 int count = 0;
18 for (int i = 1; i < n; i++) {
19 if (gcd(n, i) == 1) {
20 count++;
21 }
22 }
23 return count;
24 }
25
26 public static int gcd(int a, int b) {
27 return b == 0 ? a : gcd(b, a % b);
28 }
29}
- 从键盘输入一个n,打印一个等腰三角形。
1input:
24
3output:
4 *
5 ***
6 *****
7*******
8
9input:
107
11output:
12 *
13 ***
14 *****
15 *******
16 *********
17 ***********
18*************
1import java.util.Scanner;
2
3public class Main {
4 public static void main(String[] args) {
5 try (Scanner scanner = new Scanner(System.in)) {
6 int n = scanner.nextInt();
7 String asterisk = "*", space = " ";
8
9 for (int i = 1; i <= n; i++) {
10 System.out.println(
11 String.format(
12 "%s%s",
13 space.repeat(n - i), // 重复字符串
14 asterisk.repeat(2 * i - 1)));
15 }
16 }
17 }
18}
- 从键盘输入一个n,打印如下图形。
1input:
24
3
4output:
5 *
6 ***
7 *****
8*******
9 *****
10 ***
11 *
12
13input:
143
15
16output:
17 *
18 ***
19*****
20 ***
21 *
- 从键盘接收一个n,用来确定数组包含的元素个数。并循环读入n个数字字符,将其转换成int型数据,存储在数组中。编写一个程序,让数组中,相邻的两位进行比较,并将比较大的数字交换到后面的位置,将数组中相邻的两位依次比较,确保经过一轮比较后,数组中最大的数字放在索引为n-1的位置上。输出此时最大值在索引最大位置上的数组。
1example:
2
3input:
45
53
67
76
84
92
10
11output:
12[3, 6, 4, 2, 7]
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 try (Scanner scanner = new Scanner(System.in)) {
7 int n = scanner.nextInt();
8 int[] numbers = new int[n];
9 for (int i = 0; i < n; i++) {
10 numbers[i] = scanner.nextInt();
11 }
12 bubbleSortRound(numbers);
13 System.out.println(Arrays.toString(numbers)); // 数组不能直接打印,需要用 Arrays.toString() 转化为字符串
14 }
15 }
16
17 public static void bubbleSortRound(int[] numbers) {
18 int n = numbers.length; // length 为数组的属性而非方法
19 for (int i = 0; i < n - 1; i++) {
20 if (numbers[i] > numbers[i + 1]) {
21 int temp = numbers[i];
22 numbers[i] = numbers[i + 1];
23 numbers[i + 1] = temp;
24 }
25 }
26 }
27}
- 从键盘接收一个n,代表当前数组中包含的元素个数。依次从键盘读入n个数据,并转换成int型,保存在数组中。按照上题的方法整理数组中的元素,将数组中元素整理为从小到大有序的数组输出。(注:不允许使用内置的排序函数,或方法)
1input:
25
33
47
56
64
72
8
9output:
10
11[2, 3, 4, 6, 7]
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 try (Scanner scanner = new Scanner(System.in)) {
7 int n = scanner.nextInt();
8 int[] numbers = new int[n];
9 for (int i = 0; i < n; i++) {
10 numbers[i] = scanner.nextInt();
11 }
12 bubbleSort(numbers);
13 System.out.println(Arrays.toString(numbers)); // 数组不能直接打印,需要用 Arrays.toString() 转化为字符串
14 }
15 }
16
17 public static void bubbleSort(int[] numbers) {
18 int n = numbers.length; // length 为数组的属性而非方法
19 for (int i = 0; i < n - 1; i++) {
20 for (int j = 0; j < n - i - 1; j++) {
21 if (numbers[j] > numbers[j + 1]) {
22 int temp = numbers[j];
23 numbers[j] = numbers[j + 1];
24 numbers[j + 1] = temp;
25 }
26 }
27 }
28 }
29}
- 从键盘接收一个m,代表二维数组的行数,再从键盘接收一个n,代表二维数组的列数。利用循环读入二维数组所有的数值,并转换为int类型,存在数组中。输出该二维数组。
1example:
2
3input:
42
53
61
74
87
92
105
118
12
13output:
14[[1, 4, 7], [2, 5, 8]]
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 try (Scanner scanner = new Scanner(System.in)) {
7 int row, col;
8 row = scanner.nextInt();
9 col = scanner.nextInt();
10
11 int[][] matrix = new int[row][col];
12 for (int i = 0; i < row; i++) {
13 for (int j = 0; j < col; j++) {
14 matrix[i][j] = scanner.nextInt();
15 }
16 }
17 System.out.println(Arrays.deepToString(matrix)); // 使用 Arrays.deepToString() 打印矩阵和二维数组
18 }
19 }
20}
- 从键盘输入一个n,代表一维数组包含的元素数,从键盘读入一个由数字字符和空格组成的字符串,并将它们转换成int型存入到一维数组中。如果得到的数字不足n位,剩余的几个数组元素由0补足,如果超过n位截取前n位组成的数组,并输出该数组。
1example:
2
3input:
45
52 3 1 7 10 15
6
7output:
8[2, 3, 1, 7, 10]
9
10input:
114
1210 2
13
14output:
15[10, 2, 0, 0]
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 Scanner scanner = new Scanner(System.in);
7 int n = scanner.nextInt();
8 scanner.nextLine();
9 String numsString = scanner.nextLine();
10 scanner.close();
11
12 String[] numsStringArray = numsString.split("\\s+");
13 int[] nums = new int[n];
14 for (int i = 0; i < n; i++) {
15 if (i < numsStringArray.length) {
16 nums[i] = Integer.parseInt(numsStringArray[i]);
17 } else {
18 nums[i] = 0;
19 }
20 }
21
22 System.out.println(Arrays.toString(nums));
23 }
24}
- 从键盘接收一个由数字字符和空格组成的字符串,将其转换为整型数据存储在一维数组中。判断该一维数组中是否存在重复元素,如果有重复元素,输出False,否则输出True。
1example:
2
3input:
43 2 1 7 5 6 8 0
5
6output:
7True
8
9input:
102 2 1 3 4 3 8 6
11
12output:
13False
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 Scanner scanner = new Scanner(System.in);
7 String numsString = scanner.nextLine();
8 scanner.close();
9
10 String[] numsStringsArray = numsString.split("\\s+");
11 int len = numsStringsArray.length;
12 int[] nums = new int[len];
13
14 for (int i = 0; i < len; i++) {
15 nums[i] = Integer.parseInt(numsStringsArray[i]);
16 }
17
18 int[] uniqueNums = Arrays
19 .stream(nums) // 转化为流
20 .distinct() // 去重
21 .toArray(); // 转化为数组
22
23 System.out.println(uniqueNums.length == len);
24 }
25}
- 从键盘输入一个n,创建一个n * n的二维数组,在二维数组中,第0行的值为1,第1行的值为2,以此类推,第n-1的值为n。输出此二维数组。
1example:
2
3input:
45
5
6output:
7[[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5]]
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 try (Scanner scanner = new Scanner(System.in)) {
7 int n = scanner.nextInt();
8 int[][] matrix = new int[n][n];
9 for (int i = 0; i < n; i++) {
10 for (int j = 0; j < n; j++) {
11 matrix[i][j] = i + 1;
12 }
13 }
14 System.out.println(Arrays.deepToString(matrix));
15 }
16 }
17}
- 输出上一题得到的二维数组的转置数组。
1example:
2
3input:
45
5
6output:
7[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
8
9input:
104
11
12output:
13[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
1import java.util.Scanner;
2import java.util.Arrays;
3
4public class Main {
5 public static void main(String[] args) {
6 try (Scanner scanner = new Scanner(System.in)) {
7 int n = scanner.nextInt();
8 int[][] matrix = new int[n][n];
9 for (int i = 0; i < n; i++) {
10 for (int j = 0; j < n; j++) {
11 matrix[i][j] = j + 1;
12 }
13 }
14 System.out.println(Arrays.deepToString(matrix));
15 }
16 }
17}