一、开拓思维的java小练习题(持续更新)
1、百元买百鸡问题
练习的语法:
- for循环
思路:
- 用公鸡、母鸡、小鸡作为变量,
- 求两个三元一次方程组x+y+z=100 && 5x+3y+z/3=100
注意:
- 由于是整数除法,因此对于小鸡来说,chick/3时,chick可能不是整数,因此必须chick%3==0
//题目:公鸡五元一只,母鸡三元一只,小鸡一元三只。用100元刚好买100只鸡,用代码求出共有集中方法 //方法一: public class MoneyChick { public static void main(String[] args) { // 公鸡五元一只,母鸡三元一只,小鸡一元三只 // rooster,hen,chick指的是公鸡母鸡和小鸡的数量 int rooster; int hen; int chick; int way=0; for(rooster = 0;rooster <= 20;rooster++){ for(hen = 0;hen < 33;hen++){ for(chick = 0;chick < 99;chick++){ if(rooster+hen+chick==100 && 5*rooster+3*hen+chick/3==100){ if(chick%3==0){ way++; System.out.println("公鸡有"+rooster+"只,"+"母鸡有"+hen+"只,"+"小鸡有"+chick+"只."); System.out.println("鸡的数量为:"+rooster+"+"+hen+"+"+chick+"="+(rooster+hen+chick)); System.out.println("共花费:5*"+rooster+"+"+3+"*"+hen+"+"+chick+"/3="+(5*rooster+3*hen+chick/3)+"元"); System.out.println(""); } } } } } System.out.println("百元买百鸡共:"+way+"种方法。"); } } /* 结果: 公鸡有0只,母鸡有25只,小鸡有75只. 鸡的数量为:0+25+75=100 共花费:5*0+3*25+75/3=100元 公鸡有4只,母鸡有18只,小鸡有78只. 鸡的数量为:4+18+78=100 共花费:5*4+3*18+78/3=100元 公鸡有8只,母鸡有11只,小鸡有81只. 鸡的数量为:8+11+81=100 共花费:5*8+3*11+81/3=100元 公鸡有12只,母鸡有4只,小鸡有84只. 鸡的数量为:12+4+84=100 共花费:5*12+3*4+84/3=100元 百元买百鸡共:4种方法。 */
2、玩家与电脑猜拳小游戏
练习的语法:
- 用while写死循环
- switch与break的搭配
- if···else if···else语句
- Random方法
- Scanner键盘录入
思路:
- 用while死循环防止玩家非法出拳
- 电脑出拳–>用户出拳–>判断电脑及用户出的拳–>判断那一方胜利,加分–>判断某一方是否最终胜利–>循环或终止
注意事项:
- 如何判断选手的胜利或者失败
- 如何设置结束条件
/*题目: 猜拳小游戏,玩家出拳通过键盘录入的方式实现(0表示石头 1表示剪刀 2表示布) 电脑通过随机数的方式实现(0表示石头 1表示剪刀 2表示布) 当玩家或者电脑胜利三局,游戏结束,输出谁是赢家 */ //方法一 import java.util.Random; import java.util.Scanner; public class Demo01{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int playerCount = 0; //人赢的次数 int computerCount = 0; //机器人赢的次数 int count = 0; while(true){ Random aa = new Random(); //这句话才是刷新随机数的重要的一句话 int rnum = aa.nextInt(3); //机器人的出拳必须放在循环内,否则每次都一样 if(playerCount == 3 || computerCount == 3){ if(playerCount == 3){ System.out.println("恭喜你获得了最终的胜利~~~"); break; } if(computerCount == 3){ System.out.println("电脑获得了最终的胜利,别气垒哦~_~"); break; } }else{ System.out.println("请选择你要出的手势(0表示石头 1表示剪刀 2表示布):"); int num = sc.nextInt(); //用来接收用户的出拳 if(num>=0 && num <= 2){ //用来判定胜者,统计分数 System.out.print("本轮你出的是"); //判定用户的输出结果 if(num == 0){ System.out.print("拳头"); }else if(num == 1){ System.out.print("剪刀"); }else{ System.out.print("布"); } //判定机器人输出的结果 System.out.print("机器人出的是"); if(rnum == 0){ System.out.print("拳头,因此结果是"); }else if(rnum == 1){ System.out.print("剪刀,因此结果是"); }else{ System.out.print("布,因此结果是"); } switch(rnum-num){ //电脑减人 case 0: System.out.println("平局"); System.out.println("当前分数:"+'\t'+"你:"+playerCount+"分 电脑:"+computerCount+"分"); break; case 1: System.out.println("你赢,加一分"); playerCount++; System.out.println("当前分数:"+'\t'+"你:"+playerCount+"分 电脑:"+computerCount+"分"); break; case -2: System.out.println("你赢,加一分"); playerCount++; System.out.println("当前分数:"+'\t'+"你:"+playerCount+"分 电脑:"+computerCount+"分"); break; default: System.out.println("电脑赢,加一分"); computerCount++; System.out.println("当前分数:"+'\t'+"你:"+playerCount+"分 电脑:"+computerCount+"分"); break; } }else{ System.out.println("请出合法的手势哦!"); num = sc.nextInt(); } } } } } /* 结果: 请选择你要出的手势(0表示石头 1表示剪刀 2表示布): 0 本轮你出的是拳头机器人出的是剪刀,因此结果是你赢,加一分 当前分数: 你:1分 电脑:0分 请选择你要出的手势(0表示石头 1表示剪刀 2表示布): 3 请出合法的手势哦! 0 请选择你要出的手势(0表示石头 1表示剪刀 2表示布): 0 本轮你出的是拳头机器人出的是剪刀,因此结果是你赢,加一分 当前分数: 你:2分 电脑:0分 请选择你要出的手势(0表示石头 1表示剪刀 2表示布): 1 本轮你出的是剪刀机器人出的是剪刀,因此结果是平局 当前分数: 你:2分 电脑:0分 请选择你要出的手势(0表示石头 1表示剪刀 2表示布): 2 本轮你出的是布机器人出的是拳头,因此结果是你赢,加一分 当前分数: 你:3分 电脑:0分 恭喜你获得了最终的胜利~~~ */
//方法二 import java.util.Random; import java.util.Scanner; public class Demo1 { public static void main(String[] args) { Scanner aa = new Scanner(System.in); Random ab = new Random(); int PlayerCount = 0; int computerCount = 0; while (true){ // 请玩家出拳 System.out.println("游戏开始,请玩家出拳"); int player = aa.nextInt(); // 判断玩家出拳头的合法性 if(player<0||player>2){ System.out.println("玩家出拳不合法,请重新出拳"); }else { // 玩家先出拳 switch (player){ case 0: System.out.println("玩家出拳头"); break; case 1: System.out.println("玩家出剪刀"); break; case 2: System.out.println("玩家出布"); break; } // 电脑再出拳 int computer = ab.nextInt(3); // 展示电脑的出拳方式 switch (computer){ case 0: System.out.println("电脑出拳头"); break; case 1: System.out.println("电脑出剪刀"); break; case 2: System.out.println("电脑出布"); break; } // 电脑与人出拳的比较 int result = computer - player; if(result == 0){ System.out.println("平局"); }else if(result == -1 || result == 2){ computerCount ++; System.out.println("电脑赢"); }else { PlayerCount ++; System.out.println("玩家赢"); } } System.out.println("当前比分:电脑 VS 玩家"); System.out.println(computerCount + ":" + PlayerCount); if (PlayerCount == 3){ System.out.println("玩家获得最终胜利!"); break; }else if(computerCount == 3){ System.out.println("电脑获得最终胜利!"); break; } } } } /* 结果: 游戏开始,请玩家出拳 1 玩家出剪刀 电脑出布 玩家赢 当前比分:电脑 VS 玩家 0:1 游戏开始,请玩家出拳 3 玩家出拳不合法,请重新出拳 当前比分:电脑 VS 玩家 0:1 游戏开始,请玩家出拳 2 玩家出布 电脑出布 平局 当前比分:电脑 VS 玩家 0:1 游戏开始,请玩家出拳 1 玩家出剪刀 电脑出剪刀 平局 当前比分:电脑 VS 玩家 0:1 游戏开始,请玩家出拳 0 玩家出拳头 电脑出拳头 平局 当前比分:电脑 VS 玩家 0:1 游戏开始,请玩家出拳 1 玩家出剪刀 电脑出布 玩家赢 当前比分:电脑 VS 玩家 0:2 游戏开始,请玩家出拳 2 玩家出布 电脑出布 平局 当前比分:电脑 VS 玩家 0:2 游戏开始,请玩家出拳 1 玩家出剪刀 电脑出剪刀 平局 当前比分:电脑 VS 玩家 0:2 游戏开始,请玩家出拳 2 玩家出布 电脑出拳头 玩家赢 当前比分:电脑 VS 玩家 0:3 玩家获得最终胜利! */
3、输入一个整数,从低位开始逐位输出它的各位数字。
练习的语法:
- Scanner键盘录入
- for循环
- if···else
- 如何获取一个数字的各个位的数字
思路:
- 对于没有满十位的数字直接输出
- 对于满了十位数的数字在输出各个位的数字时应该分为最高位和中间位及最个位
注意:
- 思考如何正确给输出的位进行分类
/* 题目: 输入一个整数,从低位开始逐位输出它的各位数字。 输出语句:System.out.print(digit+" "); 例: 输入 123456 输出 6 5 4 3 2 1 */ 方法一: public class Test3_2 { public static void main(String[] args) { // 用if语句将判断分为最高位和除了最高位的位 // 其他位用循环,最高位直接除 Scanner a = new Scanner(System.in); System.out.println("请输入任意整数:"); int ru = a.nextInt(); // 第一轮if判断是判断输入的数字是否是两位数以上,如果不是则直接输出 if (ru / 10 == 0) { System.out.println(ru); } else { // 若是两位数字及以上,要对最高位及其他位进行分类判断 for (int i = 1; ru / i > 0; i *= 10) { if (ru / i > 10) { int digit = ru / i % 10; System.out.print(digit + " "); } else { System.out.print(ru / i); } } } } } /* 结果: 请输入任意整数: 98654231 1 3 2 4 5 6 8 9 */
4、判断数组内数字是奇数还是偶数
练习的语法:
- Random随机数录入数组
- 数组的录入与遍历
- for循环
- while死循环
思路:
- 看题目提示
注意:
- 无
/* 题目: 定义一个int类型的数组,数组的长度由键盘录入确定. 要求:1.数组的长度大于3,长度不能超过20,如果不在其范围之内给予提示如下: "您输入的长度不符合规定,请重新输入:"直到满足条件位置. 2.通过随机数对该数组每个元素进行赋值(范围:[1-100]之间的整数). 3.使用switch语句对数组中的每个元素进行判断是奇数还是偶数: 打印格式: 整数xx是奇数 整数xx是偶数 */ //方法一: import java.util.Random; import java.util.Scanner; public class Test3_5 { public static void main(String[] args) { Random aa = new Random(); Scanner ba = new Scanner(System.in); while(true){ System.out.println("请输入需要随机生成数据的数量(数量大于3,不能超过20):"); int l = ba.nextInt(); if(l>=3 && l<=20){ int[] arr = new int[l]; // 对数组进行随机录入 for(int i=0;i<l;i++){ arr[i] = aa.nextInt(100)+1; } // 遍历数组 for (int i = 0; i < arr.length; i++) { if(arr[i]%2==0){ System.out.println("整数"+arr[i]+"是偶数"); }else{ System.out.println("整数"+arr[i]+"是奇数"); } } break; }else{ System.out.println("您输入的长度不符合规定,请重新输入:"); } } } } /* 请输入需要随机生成数据的数量(数量大于3,不能超过20): 5 整数87是奇数 整数45是奇数 整数40是偶数 整数95是奇数 整数89是奇数 */
5、判断序列中哪两个相邻数之和最大
练习的语法:
- Random方法录入数组
- 数组的录入与遍历
- 双“指针”动态问题
思路:
- 通过for循环与Random方法给数组进行随机录入
- 通过for循环移动,将原数组arr[]的相邻两数的和存入新数组cunArr[];
- 通过“双指针”移动来确定位置
- 新数组的个数比原数组少一个内容
- local1用来确定最大的那个数字,local2用来移动
注意:
- for循环将和存入新数组时,注意i移动的步数是arr.length-1;
- local1和 local2的位置一开始在哪?什么情况下该将local2的值赋给local1;
- 在输出时,原数组中元素的位置与local1的关系
/* 题目: 用户决定生成序列的长度,并随机录入该序列,判断这个序列中哪两个相邻数合最大。 */ //方法一: import java.util.Random; import java.util.Scanner; public class Test3_6 { public static void main(String[] args) { int local1 = 0; int local2 = 1; Scanner aa = new Scanner(System.in); Random ba = new Random(); System.out.println("请输入需要生成随机数字的个数(随机数字的范围在20~99)"); int l = aa.nextInt(); int[] arr = new int[l]; System.out.println("随机生成的"+l+"个数字分别为:"); //给数组随机赋值 for (int i = 0; i < arr.length; i++) { int nub = ba.nextInt(80)+20; arr[i] = nub; System.out.print(arr[i]+" "); } int[] cunArr = new int[arr.length-1]; //将相邻位置的和存入新的数组cunArr[] for (int i = 0; i < arr.length-1; i++) { cunArr[i] = arr[i] + arr[i+1]; // System.out.print(cunArr[i] + " "); } //遍历并找出最大的数字的位置i,该位置就是原来数组中第i个与第i+1个位置上数的和 //一共有两个之指针,local1表示和最大的位置,local2会一直向右走。 //当左边大于右边,只将左值赋值给右值 //只有当出现右边大于左边的时候,跟新local1的位置,表示新的最大值已经出现 for (int i = 0; i < cunArr.length-1; i++) { if(cunArr[i]<cunArr[i+1]){ local2++; local1 = local2; //更新位置,不交换 }else{ cunArr[i+1] = cunArr[i]; //只交换,不更新位置 local2++; } } System.out.println(); System.out.println("该序列中第"+local1+"位数字与第"+(local1+1)+"位数字的和最大!"); } }