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学习内容哦~😘💕💕

相关文章
|
1月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
10天前
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
89 58
|
22天前
|
前端开发 数据安全/隐私保护
全新紫色新UI数码盲盒系统源码/全开源无加密/附教程
全新紫色新UI数码盲盒系统源码/全开源无加密/附教程 前端uniapp+H5 后端FastAdmin框架 可打包成APP多端运行 亲测可用
45 13
|
29天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
41 4
|
29天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
28 4
|
26天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
26 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
54 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
128 4
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
200 2