java经典练习题

时间:2023-02-12 20:47:15

 

1.1 问题

  实现两个变量间的数据交换,例如:有两个整数类型变量a和b,现需要使变量a的值和变量b的值进行交换。例如: a的原值为100,b的原值为200,交换后a的值为200,b的值为100。

  不使用中间变量来实现数据交换程序,即实现两个变量值的交换。可以先把a+b值赋给a,接着把a-b的值赋给b,最后把a-b的值在赋给a,请看如下代码:

 1 public class SwapExt {
 2     public static void main(String[] args) {
 3         int a = 100;
 4         int b = 200;
 5         System.out.println("a=" + a + ", b=" + b);
 6         a = a + b;
 7         b = a - b;
 8         a = a - b;
 9         System.out.println("a=" + a + ", b=" + b);
10     }
11 }

2.1 问题

  使用交互的方式计算*落体运动中物体的位置。用户从控制台输入*落体的时间t,系统计算经过时间t物体的*落体位移。计算结果保留一位小数并且输出到控制台。*落体位移公式为: s = 1/2 × g × t2 ,其中:

s (位移(m)

t (时间(s)

g (重力加速度(9.8m/s2)

 1 import java.util.Scanner;
 2 public class FreeFall {
 3     public static void main(String[] args) {
 4         Scanner scanner = new Scanner(System.in);
 5         double g = 9.80;
 6         System.out.println("请输入*下落的时间(秒):");
 7         double t = scanner.nextDouble();
 8         double s = 0.5 * g * t * t;
 9         s = Math.round(10 * s) / 10.0;//保留一位小数
10         System.out.println(t + "秒后,物体*下落了" + s + "米");
11     }
12 }

3.1 问题

  系统使用交互的方式给三个数字进行排序。例如:接收用户输入的三个整数a,b,c,a的原值是20,b的原值是5,c的原值是10,排序后a的值为5,b的值为10,c的值为20。

  1. import java.util.Scanner;
  2. public classMaxofThree {
  3.     public static void main(String[] args) {
  4.         Scannerscanner = new Scanner(System.in);
  5.         System.out.println("请依次输入三个整数:a,b,c(以空格隔开)");
  6.         int a = scanner.nextInt();
  7.         int b = scanner.nextInt();
  8.         int c = scanner.nextInt();
  9.         scanner.close();
  10.         System.out.println("a=" + a + ", b=" + b + ", c=" + c);
  11.         int temp = 0;
  12.         if (a > b) {
  13.             temp = a;
  14.             a = b;
  15.             b = temp;
  16.         }
  17.         if (a > c) {
  18.             temp = a;
  19.             a = c;
  20.             c = temp;
  21.         }
  22.         if (b > c) {
  23.             temp = b;
  24.             b = c;
  25.             c = temp;
  26.         }
  27.         System.out.println("a=" + a + ", b=" + b + ", c=" + c);
  28.     }
  29. }

水仙花数问题

 1 import java.util.Scanner;
 2 public class Test { 
 3     /**
 4      * 业务要求:计算某个范围内所有水仙花数
 5      * 分析:1、找某个范围的水仙花数需要把这个范围内的每个数取出来判断,所以需要一个for循环取数,
 6      *         从1开始到控制台输入的值(定义为range)。
 7      *         2、判断某个数是不是水仙花数需要将该数的每一位都取出来,取出来的方法是定义一个变量last,
 8      *         用来存这个数对10的余数,然后该数/10再对10取余数。。。这也是个循环,直到这个数变成零循环
 9      *         停止。所以我们定义一个变量num用来存取出来的i的值,每次取余后都对num进行/10操作,当
10      *         num==0时循环停止,便可以写出for(int num=i;num>0;num/=10){},取出来的每一位都要
11      *         求出自己的三次幂,再求和
12      *         3、得到的和sum需要与i比较,若相等,则打印出来
13      */
14     public static void main(String[] args) {
15         Scanner in = new Scanner(System.in);
16         System.out.println("请输入查找水仙花的范围:0~");
17         int range = in.nextInt();
18         in.close();
19         for (int i = 1; i < range; i++) {
20             int sum = 0;// 注意变量定义和赋初值的位置
21             for (int num = i; num > 0; num /= 10) {
22                 int last = num % 10;
23                 sum += last * last * last;// 每一轮开始sum都要清零
24             }
25             if (sum == i) {
26                 System.out.println(i + "是水仙花数");
27             }
28         }
29     }
30 }

计算百钱买百鸡的问题

 1 public class Test { 
 2     /**
 3      * 业务要求:计算百钱买百鸡
 4      * 分析:假设公鸡x只,母鸡y只,小鸡z只,那么必须满足x+y+z=100,5x+3y+z/3=100,并且z能整除3。
 5      *      用穷举法,从0开始一个一个带入去试,能满足条件就输出。
 6      *      如果都是公鸡的话,100钱只能买20只,所以0<=x<20
 7      *      如果是母鸡的话,100钱只能买30只,所以0<=y<300
 8      *      如果是小鸡的话,就是100只减去x再减去y
 9      */
10     public static void main(String[] args) {
11         for(int x=0;x<20;x++){
12             for(int y=0;y<30;y++){
13                 int z = 100-x-y;
14                 if((z%3==0)&&(5*x+3*y+z/3==100)){
15                     System.out.println("公鸡:"+x+",母鸡:"+y+",小鸡:"+z);
16                 }
17             }
18         }        
19     }
20 }

猜字母游戏

  1 import java.util.Random;
  2 import java.util.Scanner;
  3 
  4 public class Test {
  5     /**
  6      * 业务要求:猜字母游戏
  7      *         系统随机产生5个不重复的字符,然后由用户输入一个5个字符的字符串,由程序判断这5个字符
  8      *         和系统产生的5是否相同(字母和位置均相同)。如果相同,程序结束,如果不相同, 则输出比较结果以提示用户继续游戏。 
  9      * 分析: 
 10      *         1) char[] answer 被猜测字母序列 
 11      *        2) char[] input 用输入的字母序列 
 12      *        3) int count 猜测次数 
 13      *        4) int[] result = {字符匹配数量,匹配成功位置} 用户输入的序列和被猜测序列的比较结果 
 14      *功能分析设计:
 15      *   1)随机生成 (generate)
 16      *      方法算法功能描述:生成n个不重复的大写字母
 17      *      char[] generate(int n)
 18      *   2)用户输入(Input)
 19      *          方法算法功能描述:从控制台读取输入,返回5个大写字符
 20      *      char[] userInput()
 21      *   3)检查(check)用户输入
 22      *   方法算法功能描述:检查标准答案(answer)和用户输入
 23      *   (input),返回结果:{字符匹配数量,匹配成功位置} 
 24      *      int[] check(char[] answer, char[] input)
 25      *   4)提示猜中情况
 26      *     void show(int count, int[] result)
 27      *   5) main 方法完成猜测流程控制
 28      *         1)"生成答案"字符序列:5个字符
 29      *         2)等待用户的答案输入
 30      *         3)"检查用户输入"的答案,检查结果包含 匹配数量和匹配位置
 31      *         4) 统计回答数量
 32      *         5) 提示检查结果, 返回 (2)
 33      */
 34     public static void main(String[] args) {
 35         char[] answer;
 36         char[] input;
 37         int count=0;
 38         int[] result;
 39         answer = generate(5);//1)“生成答案”字符序列:5个字符
 40         System.out.println(answer);
 41         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 42         System.out.println("\t欢迎使用猜字母游戏");
 43         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
 44         while (true) {
 45             input = userInput();//2)等待用户的答案输入
 46             result = check(answer,input);//“检查用户输入”的答案
 47             count++;
 48             show(count, result);//提示检查结果
 49             if(result[0]==5&&result[1]==5){
 50                 break;//猜对退出
 51             }
 52         }
 53     }
 54     public static char[] generate(int n) {
 55         Random r = new Random();
 56         char[] letter = new char[26];
 57         char[] answer = new char[5];
 58         boolean[] used = new boolean[letter.length];
 59         for (int i = 0; i < 26; i++) {
 60             letter[i] = (char) (i + 65);
 61         }
 62         int num,index=0;
 63         do{
 64             num = r.nextInt(letter.length);
 65             if(used[num]){
 66                 continue;
 67             }
 68             answer[index++] = letter[num];
 69             used[num] = true;
 70         }while(index!=n);
 71         return answer;
 72     }
 73     public static char[] userInput() {
 74         Scanner in = new Scanner(System.in);
 75         char[] input = new char[5];
 76         String str = in.nextLine();
 77         while (str.length() != 5) {
 78             System.out.println("您输入的字母长度不对,请重新输入");
 79             str = in.nextLine();
 80         }
 81         input = str.toCharArray();
 82         return input;
 83     }
 84     public static int[] check(char[] answer, char[] input) {
 85         int[] result = new int[2];
 86         for (int i = 0; i < answer.length; i++) {
 87             for (int j = 0; j < input.length; j++) {
 88                 if (input[j] == answer[i]) {
 89                     result[0]++;
 90                     if (j == i) {
 91                         result[1]++;
 92                     }
 93                     break;//一旦找到一样的,就不用继续比对了
 94                 }
 95             }
 96         }
 97         return result;
 98     }
 99     public static void show(int count,int[] result) {
100         System.out.println("猜测"+count+"次");
101         System.out.println("你猜对了" + result[0] + "个字符,其中" + result[1]
102                 + "个字符位置正确");
103         if(result[0]==5&&result[1]==5){
104             System.out.println("恭喜,猜中!");
105         }
106     }
107 }

求质数

 1 public class Test {
 2     /**
 3      * 业务要求:求某个范围内的所有质数
 4      *         质数是只有1和自己本身两个约数的整数
 5      * 
 6      */
 7     public static void main(String[] args) {
 8         Scanner in = new Scanner(System.in);
 9         System.out.println("请输入查找质数的范围:2~");
10         int num = in.nextInt();
11         in.close();
12         for(int i=2;i<num;i++){
13             boolean isPrime = true;
14             for(int j=2;j<=(int)Math.sqrt(i);j++){
15                 System.out.println("......"+(int)Math.sqrt(i));
16                 if(i%j==0){
17                     isPrime = false;
18                     break;
19                 }
20             }    
21             if(isPrime){
22                 System.out.println(i+"是质数");}
23         }
24     }
25 }

求两个整数的最大公约数

 1 import java.util.Scanner;
 2 public class CommonDivisor  {
 3     public static void main(String[] args) {
 4         Scanner scanner = new Scanner(System.in);
 5         System.out.println("请输入第一个整数:");
 6         int first = scanner.nextInt();
 7         System.out.println("请输入第二个整数:");
 8         int second = scanner.nextInt();
 9         scanner.close();
10         // 从两个整数中较小的数开始
11         int start = first > second ? second : first;
12         int n = 1;
13         for (n = start; n >= 1; n--) {
14             // 判断n是否是两个整数的约数
15             if ((first % n == 0) && (second % n == 0))
16                 break;
17         }
18         System.out.println(first + "和" + second
19                     + "的最大公约数为:" + n);
20    }
21 }