当前位置:   article > 正文

Java练习题(经典8题)

java练习题

题目一

共有50枚硬币,可能包括4种类型:1元,5角,1角,5分。已知总价值为20元。求各种硬币的数量。

解题思路:简单分析可知硬币有多种组合,我们可以假设先抛开50枚硬币去寻找1元需要多少个硬币(明显是20个就满足),5角(40个),1角(200个),5分(400个)。最后我们在最内层循环加上50枚硬币的条件即可。

  1. public class Test1 {
  2. public static void main(String[] args) {
  3. //寻找5分钱
  4. for (int i = 0; i <= 400; i++) {
  5. //寻找1角钱
  6. for (int j = 0; j <= 200; j++) {
  7. //寻找5角钱
  8. for (int k = 0; k <= 40; k++) {
  9. //寻找1元
  10. for (int l = 0; l <= 20; l++) {
  11. if (i * 5 + j * 10 + k * 50 + l * 100 == 2000 && i+j+k+l == 50){
  12. System.out.println(i+"个5分"+j+"个1角"+k+"个5角"+l+"个1元");
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }

题目二

        鸡兔同笼问题:鸡兔一共35只,笼子里脚共有94只,请问分别有多少只鸡和多少只兔子。

解题思路:因为Java的特性变量必须要初始化,所以二元一次方程组的解法就不灵了,我们可以假设最开始鸡只有0只,进行for循环从1加到35

  1. public class Test2 {
  2. public static void main(String[] args) {
  3. for (int chick = 1; chick <= 35; chick++) {
  4. //记录兔子的数量(利用脚的数量算出兔子的数量)
  5. int rabbit = (94 - chick * 2) / 4;
  6. //如果遍历到兔子的数量加上鸡的数量等于总数量就可以break啦
  7. if (chick + rabbit == 35){
  8. System.out.println("鸡有" + chick + "只");
  9. System.out.println("兔有" + rabbit + "只");
  10. break;
  11. }
  12. }
  13. }
  14. }

题目三

        求1-2022有多少个质数(只有1和它本身两个因数)。

        这题虽然简单但是第一见到不一定写的出来,有一些细节需要注意,比如count - 1 

  1. public class Test3 {
  2. public static void main(String[] args) {
  3. //记录数量
  4. int count = 0;
  5. for (int i = 1; i <= 2022; i++) {
  6. //用于判断是否为质数
  7. boolean isSum = true;
  8. //从2到根号i寻找数字并判断能否被整除
  9. //因为因数是成对存在的,如果i从2到根号i之间都没有因数
  10. //那么在根号i之后也没有因数
  11. for (int j = 2; j <= Math.sqrt(i); j++) {
  12. //如果能被整除表明不是质数,就可以break
  13. if (i % j == 0){
  14. isSum = false;
  15. break;
  16. }
  17. }
  18. //遍历完1-2022所有数字,判断有多少个true(用count记录)
  19. if (isSum){
  20. count++;
  21. }
  22. }
  23. //因为1不是质数是整数,这里需要-1
  24. System.out.println(count - 1);
  25. }
  26. }

题目四

        求两个数的最大公约数(两个数中存在一个最大同时被两个数整除),最小公倍数(两个数拥有最小并相同的倍数)。

         这题虽然也简单,但是第一次遇到还是挺难写出来的。

  1. import java.util.Scanner;
  2. public class Test4 {
  3. public static void main(String[] args) {
  4. Scanner scanner = new Scanner(System.in);
  5. int num1 = scanner.nextInt();
  6. int num2 = scanner.nextInt();
  7. //求最大公约数,需要定义临时变量
  8. int temp = 0;
  9. while (true){
  10. //不断取余寻找因数
  11. temp = num1 % num2;
  12. //将因数赋给num1
  13. num1 = num2;
  14. //将num2置为余数
  15. num2 = temp;
  16. //直到余数为0,此时的num1就是最大公约数
  17. if (num2 == 0){
  18. System.out.println("最大公约数是" + num1);
  19. break;
  20. }
  21. }
  22. //num1 num2的值已经发生改变,这里定义新变量计算最小公倍数
  23. int num3 = scanner.nextInt();
  24. int num4 = scanner.nextInt();
  25. //先找出num3,num4之间的最大数
  26. temp = Math.max(num3,num4);
  27. //在两数最大到两数乘积之间寻找最小公倍数
  28. for (int i = temp; i <= num3 * num4; i++) {
  29. //公倍数条件
  30. if (i % num3 == 0 && i % num4 == 0){
  31. System.out.println("最小公倍数是" + i);
  32. //找到的第一个满足条件的数就是最小公倍数
  33. break;
  34. }
  35. }
  36. }
  37. }

题目五

        打印九九乘法表

对于刚接触的小伙伴来说可能是有难度的,这里我们可以换一个需求先实现打印9个*********

System.out.print("*********")[这个属于犯规],正确的是:
  1. for (int i = 0; i < 10; i++) {
  2. System.out.print("*");
  3. }

我们再提高要求实现:

*
**
***
****
*****
******
*******

  1. for (int i = 0; i < 7; i++) {
  2. for (int j = 0; j < i; j++) {
  3. System.out.print("*");
  4. }
  5. System.out.println();
  6. }

如果看不懂没关系,这段代码可以拆分成以下代码

  1. for (int i = 0; i < 1; i++) {
  2. System.out.print("*");
  3. }
  4. System.out.println();
  5. for (int i = 0; i < 2; i++) {
  6. System.out.print("*");
  7. }
  8. System.out.println();
  9. for (int i = 0; i < 3; i++) {
  10. System.out.print("*");
  11. }
  12. System.out.println();
  13. for (int i = 0; i < 4; i++) {
  14. System.out.print("*");
  15. }
  16. System.out.println();
  17. for (int i = 0; i < 5; i++) {
  18. System.out.print("*");
  19. }
  20. System.out.println();
  21. for (int i = 0; i < 6; i++) {
  22. System.out.print("*");
  23. }

 所以最终的代码就是这样:

  1. public class Test5 {
  2. public static void main(String[] args) {
  3. for (int i = 1; i <= 9; i++) {
  4. for (int j = 1; j <= i; j++) {
  5. //\t是为了好看
  6. System.out.print(i + "*" + j + "=" + i * j + "\t");
  7. }
  8. System.out.println();
  9. }
  10. }
  11. }

 题目六

        有一个n*m的棋盘,现在对这个棋盘进行黑白染色,左上角染成黑色。从左上角开始,每个黑色格的相邻格染成白色,白色格的相邻格染成黑色。
以下给出了一个5*7的棋盘的染色示例。
给定n和m,请问棋盘上一共有多少方格被染成了黑色。

题目的意思大概是这样。

解题思路:这里需要利用二维数组来理解这题,我们可以假设1就是黑色,0就是白色。然后再遍历这个二维数组,遇到1我们就计数

 这段代码可以帮助理解解题思路:

  1. public class Test6 {
  2. public static void main(String[] args) {
  3. Scanner scanner = new Scanner(System.in);
  4. int n = scanner.nextInt();
  5. int m = scanner.nextInt();
  6. int[][] arr = new int[n][m];
  7. int count = 0;
  8. for(int i = 0; i < n; i++) {
  9. for(int j = 0; j < m ; j++) {
  10. //奇数行的规律
  11. if(j % 2 == 0 && i % 2 == 0) {
  12. //表示黑色
  13. arr[i][j] = 1;
  14. }
  15. //偶数行的规律
  16. else if(i % 2 != 0 && j % 2 != 0){
  17. //表示黑色
  18. arr[i][j] = 1;
  19. }
  20. }
  21. }
  22. for(int i = 0; i < n; i++) {
  23. for(int j = 0; j < m; j++) {
  24. if(arr[i][j] == 1) {
  25. count++;
  26. }
  27. System.out.print(arr[i][j] + " ");
  28. }
  29. System.out.println();
  30. }
  31. System.out.println(count);
  32. scanner.close();
  33. }
  34. }

其实我们在"上色的时候就可以计数了",所以代码可以简化一下(省略上色):

  1. public class Test6 {
  2. public static void main(String[] args) {
  3. Scanner scanner = new Scanner(System.in);
  4. int n = scanner.nextInt();
  5. int m = scanner.nextInt();
  6. int[][] arr = new int[n][m];
  7. int count = 0;
  8. for(int i = 0; i < n; i++) {
  9. for(int j = 0; j < m ; j++) {
  10. //奇数行的规律
  11. if(j % 2 == 0 && i % 2 == 0) {
  12. count++;
  13. }
  14. //偶数行的规律
  15. else if(i % 2 != 0 && j % 2 != 0){
  16. count++;
  17. }
  18. }
  19. }
  20. System.out.println(count);
  21. }
  22. }

题目七

        在1至2022中,有多少个数的数位中包含数字9?
  注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。

解题思路:把1-2022转换字符串,再利用indexOf方法判断。

String.valueof()方法:将int类型转换成String类型。

str.indexOf()方法:返回指定子字符串在此字符串中第一次出现处的索引,如果没有返回-1。

  1. public class Test7 {
  2. public static void main(String[] args) {
  3. //记录数量
  4. int count = 0;
  5. for (int i = 1; i <= 2022; i++) {
  6. //将整数i转换成字符串
  7. String str = String.valueOf(i);
  8. //利用String类的indexOf方法
  9. //返回指定子字符串在此字符串中第一次出现处的索引,如果没有返回-1。
  10. if (str.indexOf("9")!=-1){
  11. count++;
  12. }
  13. }
  14. System.out.println(count);
  15. }
  16. }

题目八

        判断水仙花数,例如153 = 1*1*1 + 5*5*5 + 3*3*3

        求1-2022有多少个水仙花数

解题思路:关键就是表达个位,百位,千位的数。

  1. public class Test8 {
  2. public static void main(String[] args) {
  3. //记录个数
  4. int count = 0;
  5. for (int i = 1; i <= 2022; i++) {
  6. //表示个位
  7. int bits = i % 10;
  8. //表示十位
  9. int ten = i / 10 % 10;
  10. //表示百位
  11. int hundred = i / 100 % 10;
  12. //水仙花数条件
  13. if(bits * bits * bits + ten * ten * ten + hundred * hundred * hundred == i){
  14. count++;
  15. }
  16. }
  17. System.out.println(count);
  18. }
  19. }

有错误欢迎指出!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/515841
推荐阅读
相关标签
  

闽ICP备14008679号