11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题(下)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题(上)

十一、案例七:数字解密

思路过程:

反过来推,但是中间%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学习内容哦~😘💕💕

相关文章
|
13天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
53 4
|
24天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
43 17
|
15天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
47 3
|
17天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
32 2
|
19天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
18 1
|
21天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
25天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
19 3
|
24天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
25天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
16 2
|
25天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
16 1