实例 41

题目

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了 一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分 成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只 猴子都是这样做的,问海滩上原来最少有多少个桃子?

分析

逆向推理,从最后一只猴子从后往前推,具体过程见注释。

实现

  1. /**
  2. * Created with IntelliJ IDEA.
  3. *
  4. * @author : cunyu
  5. * @version : 1.0
  6. * @email : 747731461@qq.com
  7. * @website : https://cunyu1943.github.io
  8. * @date : 2021/6/7 14:55
  9. * @project : Java 编程实例
  10. * @package : PACKAGE_NAME
  11. * @className : Example41
  12. * @description :
  13. */
  14. public class Example41 {
  15. public static void main(String[] args) {
  16. // 关于index,可以从1开始,但是我们知道桃子数一定是要大于5的,所以从6开始
  17. int index = 6;
  18. // 一直找,一直找
  19. while (true) {
  20. // 对于每一个index都调用finds()方法来判断其是否符合条件
  21. boolean finds = finds(index);
  22. // 如果符合条件,则输出结果,并且终止循环
  23. if (finds) {
  24. System.out.println("海滩上最少有 " + index + " 个桃子。");
  25. break;
  26. }
  27. // 6 除以 5 余 1,那么步进就得是 5,因为1~4得到的余数分别为2,3,4,0,当然,步进为 1 也可以
  28. index += 5;
  29. }
  30. }
  31. /**
  32. * 定义一个判断数字是否符合条件,符合就返回一个true,否则返回false
  33. * 所谓条件就是该数每次计算之间,num值一定要大于5,不然怎么分五份呢是不?
  34. *
  35. * @param num
  36. * @return
  37. */
  38. public static boolean finds(int num) {
  39. // 定义要返回的布尔值
  40. boolean flag = false;
  41. // 有5只猴子,判断5次
  42. for (int i = 1; i <= 5; i++) {
  43. // 判断num是否大于5,要是还没到第五只猴子呢就不足五个桃子了,那第五只猴子要生气了,并且判断该数是否除5余1
  44. if (num > 5 && num % 5 == 1) {
  45. // 判断是不是最后一只猴子,如果到最后一直猴子了,且符合条件,就返回true,表明找到了该数。
  46. if (i == 5) {
  47. flag = true;
  48. } else {
  49. // 如果不是最后一只猴子,那么该猴子丢掉一个,且拿走五分之一,剩下原来桃子数-1的4/5
  50. num = ((num - 1) * 4) / 5;
  51. }
  52. } else {
  53. // 如果该数小于5导致没法分了,或者不符合最后能丢掉一个的条件,直接返回false
  54. return false;
  55. }
  56. }
  57. return flag;
  58. }
  59. }

结果

那些年,我们一起做过的 Java 课后练习题(41 - 45) - 图1

实例 42

题目

809 X = 800 X + 9 * X,其中 X 代表一个两位数,求 X 所代表的数。

分析

遍历两位数,只要满足上述条件的,则说明它是 X 所代表的数。

实现

  1. /**
  2. * Created with IntelliJ IDEA.
  3. *
  4. * @author : cunyu
  5. * @version : 1.0
  6. * @email : 747731461@qq.com
  7. * @website : https://cunyu1943.github.io
  8. * @date : 2021/6/7 15:14
  9. * @project : Java 编程实例
  10. * @package : PACKAGE_NAME
  11. * @className : Example42
  12. * @description :
  13. */
  14. public class Example42 {
  15. public static void main(String[] args) {
  16. int num = 0;
  17. boolean flag = false;
  18. for (int i = 10; i < 100; i++) {
  19. if (809 * i == (800 * i + 9 * i)) {
  20. if (((8 * i) < 100) && ((9 * i) > 99)) {
  21. flag = true;
  22. num = i;
  23. break;
  24. }
  25. }
  26. }
  27. System.out.println("符合的数:" + num);
  28. }
  29. }

结果

那些年,我们一起做过的 Java 课后练习题(41 - 45) - 图2

实例 43

题目

求 0 - 7 所能组成的奇数个数。

分析

在 0 - 7 中组成的数 0 不能开头,所以数为一位数时奇数有 1,3,5,7;
两位数时奇数有 4 7;
三位数一直到 8 位数是前面奇数个数
8。

实现

  1. /**
  2. * Created with IntelliJ IDEA.
  3. *
  4. * @author : cunyu
  5. * @version : 1.0
  6. * @email : 747731461@qq.com
  7. * @website : https://cunyu1943.github.io
  8. * @date : 2021/6/7 15:20
  9. * @project : Java 编程实例
  10. * @package : PACKAGE_NAME
  11. * @className : Example43
  12. * @description :
  13. */
  14. public class Example43 {
  15. public static void main(String[] args) {
  16. int count = 0;
  17. int sum = 0;
  18. // 而 0 到 7 有 8 个数,但是最高位是 7 位,0 不能放在开头
  19. for (int i = 1; i < 9; i++) {
  20. if (i == 1) {
  21. count = 4;
  22. } else if (i == 2) {
  23. count *= 7;
  24. } else {
  25. count *= 8;
  26. }
  27. sum += count;
  28. System.out.println("0 - 7 组成的 " + i + " 位奇数个数:" + sum);
  29. }
  30. System.out.println("共组成的奇数个数:" + sum);
  31. }
  32. }

结果

那些年,我们一起做过的 Java 课后练习题(41 - 45) - 图3

实例 44

题目

一个偶数总能表示为两个素数之和。

分析

输入一个数之后,先判断其是否为偶数,然后判断它是否能分解为两个素数,即循环判断 2 ~ (num/2 + 1) 范围内是否存在一个素数与 num 减去该素数后是否仍然为素数。

实现

  1. import java.util.Scanner;
  2. /**
  3. * Created with IntelliJ IDEA.
  4. *
  5. * @author : cunyu
  6. * @version : 1.0
  7. * @email : 747731461@qq.com
  8. * @website : https://cunyu1943.github.io
  9. * @date : 2021/6/7 15:28
  10. * @project : Java 编程实例
  11. * @package : PACKAGE_NAME
  12. * @className : Example44
  13. * @description :
  14. */
  15. public class Example44 {
  16. public static void main(String[] args) {
  17. System.out.println("输入一个偶数");
  18. Scanner scan = new Scanner(System.in);
  19. int num = scan.nextInt();
  20. if (num % 2 != 0) {
  21. System.out.println("输入的不是偶数");
  22. return;
  23. }
  24. if (num == 4) {
  25. System.out.println("4 = 2 + 2");
  26. return;
  27. }
  28. function(num);
  29. }
  30. /**
  31. * 判断一个偶数是否能分解为两个素数
  32. *
  33. * @param num
  34. */
  35. public static void function(int num) {
  36. for (int i = 2; i < num / 2 + 1; i++) {
  37. if (isPrime(i) && isPrime(num - i)) {
  38. System.out.println(num + " = " + i + " + " + (num - i));
  39. break;
  40. }
  41. }
  42. }
  43. /**
  44. * 判断一个数是否为素数
  45. *
  46. * @param num
  47. * @return true 为素数,false 为非素数
  48. */
  49. public static boolean isPrime(int num) {
  50. boolean flag = true;
  51. for (int i = 2; i < Math.sqrt(num) + 1; i++) {
  52. if (num % i == 0) {
  53. flag = false;
  54. break;
  55. }
  56. }
  57. return flag;
  58. }
  59. }

结果

那些年,我们一起做过的 Java 课后练习题(41 - 45) - 图4

实例 45

题目

判断一个数能被几个 9 整除?

分析

要判断一个数能被几个 9 整除,就需要用这个数不断来除以 9,直到余数为 0 才退出。

实现

  1. import java.util.Scanner;
  2. /**
  3. * Created with IntelliJ IDEA.
  4. *
  5. * @author : cunyu
  6. * @version : 1.0
  7. * @email : 747731461@qq.com
  8. * @website : https://cunyu1943.github.io
  9. * @date : 2021/6/7 15:29
  10. * @project : Java 编程实例
  11. * @package : PACKAGE_NAME
  12. * @className : Example45
  13. * @description :
  14. */
  15. public class Example45 {
  16. public static void main(String[] args) {
  17. Scanner scanner = new Scanner(System.in);
  18. System.out.println("请输入一个整数");
  19. int num = scanner.nextInt();
  20. int tmp = num;
  21. int count = 0;
  22. for (int i = 0; tmp % 9 == 0; ) {
  23. tmp /= 9;
  24. count++;
  25. }
  26. System.out.println(num + " 能被 " + count + " 个 9 整除!");
  27. }
  28. }

结果

那些年,我们一起做过的 Java 课后练习题(41 - 45) - 图5

那些年,我们一起做过的 Java 课后练习题(41 - 45) - 图6