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

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

相关文章
|
2天前
|
JavaScript Java BI
Java毕设之新生报到系统的设计与实现
Java毕设之新生报到系统的设计与实现
10 3
|
10天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
1天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
8 0
|
1天前
|
Java 云计算
Java智能区域医院云HIS系统SaaS源码
云HIS提供标准化、信息化、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程,提升患者满意度、基层首诊率,通过信息共享、辅助诊疗等手段,提高基层医生的服务能力构建和谐的基层医患关系。
13 2
|
1天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
1天前
|
Java C语言
详解java方法与递归
详解java方法与递归
8 3
|
2天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
18 2
|
2天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
8 0
|
2天前
|
JavaScript 小程序 Java
基于java的少儿编程网上报名系统
基于java的少儿编程网上报名系统
10 2
|
2天前
|
JavaScript 小程序 Java
Java毕设之在线医疗服务系统的设计与实现
Java毕设之在线医疗服务系统的设计与实现
7 3