十一、案例七:数字解密
思路过程:
反过来推,但是中间%10那一步反过来是什么呢?
第二排: 6 14 13 8
它们是通过第一排+5得来的数字
第二排的最大值只能到14,因为第一排最大的只能到9,9+5=14;最小值是5,虽然第一排1 9 8 3中没有0,但是假设有0,那么第二排最小的就是5.
所以第二排的数字范围是5~14之间
在对10取余时的结果:
所以在解密的时候,5 ~ 9不需要动, 0~4需要+10
才能恢复原来的数字
分析:
1.定义数组记录解密之后的结果
2.反转
3.由于加密是对10取余的方式进行获取的,所以在解密的时候就需要判断,0~ 4之间+10, 5~9数字不变
4.每一位-5
5.获取数组里面的每一位数字并拼接成最终的结果,注意number=number*10+arr[i];
public class Test11 { public static void main(String[] args) { //1.定义数组记录解密之后的结果 int[] arr={8,3,4,6}; //2.先反转 for (int i = 0,j=arr.length-1; i < j; i++,j--) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } //3.由于加密是对10取余的方式进行获取的, //所以在解密的时候就需要判断,0~4之间+10,5~9数字不变 for (int i = 0; i < arr.length; i++) { if(arr[i]>=0&&arr[i]<=4){ arr[i]=arr[i]+10; } } //4.每一位-5 for (int i = 0; i < arr.length; i++) { arr[i]=arr[i]-5; } //5.获取数组里面的每一位数字并拼接成最终的结果 int number=0; for (int i = 0; i < arr.length; i++) { number=number*10+arr[i]; } System.out.println(number); } }
十二、案例八:抢红包
思路:
随机数会想到Random,但是Random可能下一次随机的数字与上次相同.
那怎么办呢?
定义一个新的数组,里面什么也没有,将随机到的数据添加到数组中,下一次随机得到的数据和这个数组中的数据进行比较,存在的话那么就是无效的奖项,需要重抽一次.
分析:
1.定义数组表示奖池
2.定义新数组用于存储抽奖的结果
定义方法判断prize在数组中是否存在
存在:true
不存在:false
3.抽奖
(1)因为有5个奖项,所以要循环五次
(2)获取随机索引
(3)获取奖项
(4)判断当前的奖项是否存在,如果存在则重新抽取,如果不存在,表示有效奖项
(5)把当前抽到的奖项添加到NewArr当中
(6)只有当抽到的是有效奖项时,索引才会发生变化,新抽到的奖的面值才会被存到新数组newArr中.添加完毕后,移动索引
4.遍历newArr
import java.util.Random; public class Test12 { public static void main(String[] args) { //1.定义数组表示奖池 int[] arr={2,588,888,1000,10000}; //2.定义新数组用于存储抽奖的结果 int[] newArr=new int[arr.length]; //3.抽奖 Random r=new Random(); for (int i = 0; i < 5; ) { //注意这里没有写i++ //获取随机索引 int randomIndex=r.nextInt(arr.length); //获取奖项 int prize=arr[randomIndex]; //判断当前的奖项是否存在,如果存在则重新抽取,如果不存在,表示有效奖项 boolean flag=contains(newArr,prize); //当抽到无效奖项时,不会运行下面的if语句,i的值不改变,会重新进入循环 if(!flag){ //把当前抽到的奖项添加到NewArr当中 newArr[i]=prize; //添加完毕后,移动索引 i++; //只有当抽到的是有效奖项时,索引才会发生变化,新抽到的奖的面值才会被存到新数组newArr中 } } //4.遍历newArr for (int i = 0; i < newArr.length; i++) { System.out.println(newArr[i]); } } // 定义方法判断prize在数组中是否存在 // 存在:true // 不存在:false public static boolean contains(int[] arr,int prize){ for (int i = 0; i < arr.length; i++) { if(arr[i]==prize){ return true; } } return false; } }
这里需要注意:
当抽取最后一个奖项的时候,他被抽取的概率是1/数组的长度,在这道题中也就是20%,效率比较低.
如何优化一下算法呢?
思路二:
1.把奖池里面的所有奖项打乱顺序
2.遍历奖池
import java.util.Random; public class Test13 { public static void main(String[] args) { // 1.把奖池里面的所有奖项打乱顺序 int[] arr={2,588,888,1000,10000}; Random r=new Random(); for (int i = 0; i < arr.length; i++) { //后去随机索引 int randomIndex=r.nextInt(arr.length); //拿着i和随机索引randomIndex上的值进行交换 int temp=arr[i]; arr[i]=arr[randomIndex]; arr[randomIndex]=temp; } // 2.遍历奖池,从0索引开始获取每一个奖项 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
思路二的方法不会出现无效奖项的情况,并且达到了将奖项打乱的效果.
十三、案例九:双色球彩票系统
思路:
1.随机生成中奖号码
2.用户输入彩票号码(红球+蓝球)
3.判断中奖情况
第一步随机生成中奖号码:
分析:
1.生成中奖号码,要用数组去存
2.定义生成中奖号码的方法:
(1)创建数组用于添加中奖号码
//6个红球 1个蓝球 数组长度:7
(2)随机生成号码并添加到数组中
红球:不能重复的生成
蓝球:可以和红球的号码重复
(3)生成红球号码并添加到数组中
随机获取红球号码
因为红球号码不能重复,所以拿着号码到arr数组中进行判断
所以写一个方法来判断
不存在,把红球号码添加到arr数组中
(4)生成蓝球号码添加到数组中的最大索引处
(5)返回数组
3.遍历数组
import java.util.Random; public class Test14 { public static void main(String[] args) { //1.生成中奖号码 int[] arr=createNumber(); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } } public static int[] createNumber() { //1.创建数组用于添加中奖号码 //6个红球 1个蓝球 数组长度:7 int[] arr=new int[7]; // 2.随机生成号码并添加到数组中 // 红球:不能重复的生成 // 蓝球:可以和红球的号码重复 //生成红球号码并添加到数组中 Random r=new Random(); for (int i = 0; i < 6; ) {//注意这里没有i++ //获取红球号码 int redNumber=r.nextInt(33)+1; // 因为红球号码不能重复,所以拿着号码到arr数组中进行判断 // 所以写一个方法来判断 boolean flag=contains(arr,redNumber);//将方法返回的结果定义一个变量接收 if(!flag){ //不存在,把红球号码添加到数组中 arr[i]=redNumber; i++; } } //生成蓝球号码添加到数组中的最大索引处 int blueNumber=r.nextInt(16)+1; arr[arr.length-1]=blueNumber; return arr; } //用于判断数字在数组中是否存在 public static boolean contains(int[] arr,int number){ for (int i = 0; i < arr.length; i++) { if(arr[i]==number){ return true; } } return false; } }
第二步用户输入彩票号码
分析:
1.创建数组用于添加用户购买的彩票号码
6个红球 1个蓝球 数组长度:7
2.利用键盘录入让用户输入
让用户输入红球号码:
(1)两个条件:要求redNumber要在1-33之间;并且唯一不重复
(2)第一个条件存在的情况下,判断第二个条件是不是唯一不重复的.有效的,可以添加到数组中;无效的,输出"当前号码已存在,请重新输入"
(3)第一个条件不存在的情况下,输出"当前红球号码超出范围"
让用户输入蓝球号码:
(1)随机生成蓝球号码
(2)判断蓝球号码在不在范围内:
在的话将号码赋值给数组的最大索引处并跳出while循环,不在的话,输出提示语句当前蓝球号码超出范围,并再次进入while循环,让用户重新输入蓝球的号码
import java.util.Random; import java.util.Scanner; public class Test14 { public static void main(String[] args) { //1.生成中奖号码 int[] arr = createNumber(); //2.用户输入彩票号码(红球+蓝球) int[] uesrInputArr=userInputNumber(); //遍历用户输入的彩票号码 for (int i = 0; i < uesrInputArr.length; i++) { System.out.print(uesrInputArr[i]+" "); } } public static int[] userInputNumber() { //1.创建数组用于添加用户购买的彩票号码 //6个红球 1个蓝球 数组长度:7 int[] arr = new int[7]; //2.利用键盘录入让用户输入 Scanner sc = new Scanner(System.in); for (int i = 0; i < arr.length-1; ) { //让用户输入红球号码 System.out.println("请输入第" + (i + 1) + "个红球号码"); int redNumber = sc.nextInt(); //要求redNumber要在1-33之间;并且唯一不重复 if (redNumber >= 1 && redNumber <= 33) { //第一个条件存在的情况下,判断第二个条件是不是唯一不重复的 boolean flag = contains(arr, redNumber); if (!flag) { //不存在 //表示有效的,可以添加到数组中 arr[i] = redNumber; i++; //注意有效之后才可以存入数组中.i才可以变化,所以这个for循环那里没有i++ } else { //存在 System.out.println("当前号码已存在,请重新输入"); } } else { System.out.println("当前红球号码超出范围"); } } while (true) { //让用户输入蓝球号码 System.out.println("请输入蓝球号码:"); //1~16 int blueNumber=sc.nextInt(); if (blueNumber >= 1 && blueNumber <= 16) { arr[arr.length - 1] = blueNumber; break; //猜对了就跳出循环 } else { System.out.println("当前蓝球号码超出范围"); //如果超出范围了需要重新输入,所以要用一个循环 } } return arr; } public static int[] createNumber() { //1.创建数组用于添加中奖号码 //6个红球 1个蓝球 数组长度:7 int[] arr=new int[7]; // 2.随机生成号码并添加到数组中 // 红球:不能重复的生成 // 蓝球:可以和红球的号码重复 //生成红球号码并添加到数组中 Random r=new Random(); for (int i = 0; i < 6; ) { //获取红球号码 int redNumber=r.nextInt(33)+1; // 因为红球号码不能重复,所以拿着号码到arr数组中进行判断 // 所以写一个方法来判断 boolean flag=contains(arr,redNumber);//将方法返回的结果定义一个变量接收 if(!flag){ //不存在,把红球号码添加到数组中 arr[i]=redNumber; i++; } } //生成蓝球号码添加到数组中的最大索引处 int blueNumber=r.nextInt(16)+1; arr[arr.length-1]=blueNumber; return arr; } //用于判断数字在数组中是否存在 public static boolean contains(int[] arr,int number){ for (int i = 0; i < arr.length; i++) { if(arr[i]==number){ return true; } } return false; } }
第三步判断用户的中奖情况
分析:
1.定义一个红球的统计变量
2.定义一个蓝球的统计变量
默认是0,默认都没有中奖
3.判断红球的中奖情况
(1)注意for循环处的判断条件那里数组的长度要-1
(2)定义变量接收用户输入彩票号码方法的数组返回值
(3)遍历中奖号码的数组与返回的数组值比较,如果找到了,统计变量++,那么后面的数字就没有必要比较了,break跳出内循环,继续判断下一个红球号码是否中奖
4.判断蓝球的中奖情况
(1)定义变量接收用户输入彩票号码方法的数组返回值的最大索引处的数值
(2)比较中奖号码的数组的最大索引处的数值和接收到的数值,
一样的话,蓝球的统计变量++
5.可以打印红球和蓝球的中奖个数
6.if-else if语句根据红球的个数以及篮球的个数来判断中奖情况
7.为了更好地测试代码,最好在开始将彩票的中奖号码打印出来,以便于我们测试代码正确与否
import java.util.Random; import java.util.Scanner; public class Test14 { public static void main(String[] args) { //1.生成中奖号码 int[] arr = createNumber(); //123456 7 //测试的时候最好这样打印出来结果便于测试代码 System.out.println("*****************************"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } System.out.println(""); System.out.println("*****************************"); //2.用户输入彩票号码(红球+蓝球) int[] userInputArr=userInputNumber(); //654321 /*//遍历用户输入的彩票号码 for (int i = 0; i < userInputArr.length; i++) { System.out.print(userInputArr[i]+" "); } */ //3.判断用户的中奖状况 //红球 蓝球 //默认是0,默认都没有中奖 int redCount=0; int blueCount=0; //判断红球的中奖情况,注意for循环处的判断条件那里数组的长度要-1 for (int i = 0; i < userInputArr.length-1; i++) { int redNumber= userInputArr[i]; for (int j = 0; j < arr.length-1; j++) { //这里数组的长度也要-1 if(redNumber==arr[j]){ redCount++; break; //如果找到了,那么后面的数字就没有必要比较了 //跳出内循环,继续判断下一个红球号码是否中奖 } } } //判断蓝球的中奖情况 int blueNumber=userInputArr[userInputArr.length-1]; if(blueNumber==arr[arr.length-1]){ blueCount++; } //可以打印红球和蓝球的中奖个数 System.out.println("红球的中奖个数是:"+redCount); System.out.println("蓝球的中奖个数是:"+blueCount); //根据红球的个数以及篮球的个数来判断中奖情况 if(redCount==6&&blueCount==1){ System.out.println("恭喜你,中奖1000万"); } else if (redCount==6&&blueCount==0) { System.out.println("恭喜你,中奖五百万"); } else if (redCount==5&&blueCount==1) { System.out.println("恭喜你,中奖3000"); } else if ((redCount==5&&blueCount==0)||(redCount==4&&blueCount==1)) { System.out.println("恭喜你,中奖200"); }else if ((redCount==4&&blueCount==0)||(redCount==3&&blueCount==1)) { System.out.println("恭喜你,中奖10"); }else if ((redCount==2&&blueCount==1)||(redCount==1&&blueCount==1)||(redCount==0&&blueCount==1)) { System.out.println("恭喜你,中奖5"); }else{ System.out.println("谢谢惠顾"); } } public static int[] userInputNumber() { //1.创建数组用于添加用户购买的彩票号码 //6个红球 1个蓝球 数组长度:7 int[] arr = new int[7]; //2.利用键盘录入让用户输入 Scanner sc = new Scanner(System.in); for (int i = 0; i < arr.length-1; ) { //让用户输入红球号码 System.out.println("请输入第" + (i + 1) + "个红球号码"); int redNumber = sc.nextInt(); //要求redNumber要在1-33之间;并且唯一不重复 if (redNumber >= 1 && redNumber <= 33) { //第一个条件存在的情况下,判断第二个条件是不是唯一不重复的 boolean flag = contains(arr, redNumber); if (!flag) { //不存在 //表示有效的,可以添加到数组中 arr[i] = redNumber; i++; //注意有效之后才可以存入数组中.i才可以变化,所以这个for循环那里没有i++ } else { //存在 System.out.println("当前号码已存在,请重新输入"); } } else { System.out.println("当前红球号码超出范围"); } } while (true) { //让用户输入蓝球号码 System.out.println("请输入蓝球号码:"); //1~16 int blueNumber=sc.nextInt(); if (blueNumber >= 1 && blueNumber <= 16) { arr[arr.length - 1] = blueNumber; break; //猜对了就跳出循环 } else { System.out.println("当前蓝球号码超出范围"); //如果超出范围了需要重新输入,所以要用一个循环 } } return arr; } public static int[] createNumber() { //1.创建数组用于添加中奖号码 //6个红球 1个蓝球 数组长度:7 int[] arr=new int[7]; // 2.随机生成号码并添加到数组中 // 红球:不能重复的生成 // 蓝球:可以和红球的号码重复 //生成红球号码并添加到数组中 Random r=new Random(); for (int i = 0; i < 6; ) { //注意这里不要i++ //获取红球号码 int redNumber=r.nextInt(33)+1; // 因为红球号码不能重复,所以拿着号码到arr数组中进行判断 // 所以写一个方法来判断 boolean flag=contains(arr,redNumber);//将方法返回的结果定义一个变量接收 if(!flag){ //不存在,把红球号码添加到数组中 arr[i]=redNumber; i++; } } //生成蓝球号码添加到数组中的最大索引处 int blueNumber=r.nextInt(16)+1; arr[arr.length-1]=blueNumber; return arr; } //用于判断数字在数组中是否存在 public static boolean contains(int[] arr,int number){ for (int i = 0; i < arr.length; i++) { if(arr[i]==number){ return true; } } return false; } }
总结
今天的内容你是否有所收获呢友友们🥰如果有写的不对的地方,欢迎大家帮我指正.最后,希望友友们点赞收藏一下博客关注后续的Java学习内容哦~😘💕💕