1.数字加密
需求:
某系统的数字密码,比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
分析:
1.将每位数据存入到数组中去,遍历数组每位数据按照规则进行更改,把更改后的数据从新存入到数组中。
2. 将数组的前后元素进行交换,数组中的最终元素就是加密后的结果。
public class Test1 {
public static void main(String[] args) {
// 定义一个数组存储需要加密的数据
int[] arr = new int[]{
1, 9, 8, 3};
// 2.遍历数组中的每个数据,按照规则进行修改
for (int i = 0; i < arr.length; i++) {
arr[i] = (arr[i] + 5 )% 10;
}
// 3. 然后将数组中的元素进行反转
for (int i = 0, j = arr.length -1; i < j; i++, j--) {
// 交换i和j位置处的值,即可反转
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
// 4.遍历数组红的每个元素输出即可
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
前面我们输入的数组是:1983,经过加密后:
E:\java\jdk-11.0.9\bin\java.exe "-javaagent:E:\soft\IntelliJ IDEA 2019.1.4\lib\idea_rt.jar=52213:E:\soft\IntelliJ IDEA 2019.1.4\bin" -Dfile.encoding=UTF-8 -classpath E:\java\example\out\production\Array3 Case.Test1
8346
Process finished with exit code 0
本次案例中是如何完成数组元素的反转的?
1.定义两个变量分别占数组的首尾位置。
2.一个变量往前走,一个变量往后走,同步交换双方位置处的值。
怎么将加密后的数据解密出来呢?
2.模拟福利彩票中的双色球
(1)业务分析、随机生成一组中奖号码
随机生成一组中奖号码的分析:
1.中奖号码由6个红球和1个篮球组成(注意:6个红球要求不同重复)
2.可以定义方法用于返回一组中奖号码(7个数据),返回的形式是一个整型数组。
public static int[] createLuckNumber(){
// a、定义一个动态初始化的数组,存储7个数字
int[] numbers = new int[7];
// b、遍历数组,为每个位置生成对应的号码。(注意,遍历前6个位置,生成6个不重复的红球号码
// 范围是1-33)
Random r = new Random();
for (int i = 0; i < numbers.length - 1 ; i++) {
while (true){
int data = r.nextInt(33) +1;
// 然后需要判断当前随机的这个号码之前是否出现过,出现过就需要重新随机,直到不重复为止
// 定义一个flag变量,默认认为data是没有重复的
boolean flag = true;
for (int j = 0; j < i; j++) {
if (numbers[j] == data){
// data当前这个数据之前出现过,不能用
flag = false;
break;
}
}
if (flag){
// data 这个数据之前没有出现过,可以使用了
numbers[i] = data;
break;
}
}
}
// d、为第7个位置生成一个1-16的号码作为篮球号码
numbers[numbers.length - 1] = r.nextInt(16) + 1;
return numbers;
}
本次案例中是如何去保证随机的6个中奖的红球号码不重复的
1.每次随机一个红球号码后去数组红判断是否存在
2.存在需要重新随机一个数字直到不重复位置。
(2)用户输入一组双色球号码
public static int[] userInputNumber(){
// a.定义一个数组存储7个号码
int[] numbers = new int[7];
// b.让用户录入6个红球号码
Scanner sc = new Scanner(System.in);
for (int i = 0; i < numbers.length -1 ; i++) {
System.out.println("请你输入第" + (i + 1)+"个红球号码(1-33)不重复:");
int data = sc.nextInt();
// c.将当前录入的i个数据存储到数组中
numbers[i] = data;
}
// d. 然后录入一个蓝球的号码
System.out.println("请你输入蓝球号码(1-16):");
numbers[numbers.length] = sc.nextInt();
}
(3)判断中奖情况
中奖情况判断的分析:
1.定义一个方法,可以接收中奖号码的数组,用户选号的数组。
2.根据命中红球数和蓝球数判断最终的中奖情况并输出详情和中奖金额。
`` public static void judge(int[] luckNumbers, int[] userNumbers ) {
//判断是否中奖了
// 1.定义两个变量分别存储红球命中的个数,以及蓝球命中的个数
int redHitNumbers = 0;
int blueHitNumbers = 0;
//2.判断红球命中了几个,开始统计
for (int i = 0; i < userNumbers.length - 1; i++) {
for (int j = 0; j < luckNumbers.length - 1; j++) {
//每次找到了相等,表示当前号码命中了
if (userNumbers[i] == luckNumbers[j]) {
redHitNumbers++;
break;
}
}
}
// 蓝球号码是否命中了?
blueHitNumbers = luckNumbers[6] == userNumbers[6] ? 1 : 0;
System.out.println("中奖号码是:");
System.out.println(luckNumbers);
System.out.println("你投注号码是:");
System.out.println(userNumbers);
System.out.println("你命中了几个红球:" + redHitNumbers);
System.out.println("你是否命中蓝球:" + (blueHitNumbers == 1 ? "是":"否"));
// 判断中奖情况
if (blueHitNumbers == 1 && redHitNumbers < 3) {
System.out.println("恭喜你,中了5元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 3 || blueHitNumbers == 0 && redHitNumbers == 4) {
System.out.println("恭喜你,中了10元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 4 || blueHitNumbers == 0 && redHitNumbers == 5) {
System.out.println("恭喜你,中了200元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 5) {
System.out.println("恭喜你,中了3000元奖");
} else if (blueHitNumbers == 0 && redHitNumbers == 6) {
System.out.println("恭喜你,中了五百万元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 6) {
System.out.println("恭喜你,中了一千万元奖");
} else{
System.out.println("你没有中奖");
}
}
}
本次案例中是如何去统计红球的命中数量的?
1.遍历用户的每个选号,然后遍历中奖号码的数组。
2.看当前选号是否在中奖号码中存在,存在则命中数量加1
3.双色球综合代码汇总
import java.util.Random;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
int[] luckNumbers = createLuckNumber();
int[] userNumbers = userInputNumber();
judge(luckNumbers,userNumbers);
}
public static int[] createLuckNumber(){
// a、定义一个动态初始化的数组,存储7个数字
int[] numbers = new int[7];
// b、遍历数组,为每个位置生成对应的号码。(注意,遍历前6个位置,生成6个不重复的红球号码
// 范围是1-33)
Random r = new Random();
for (int i = 0; i < numbers.length - 1 ; i++) {
while (true){
int data = r.nextInt(33) +1;
// 然后需要判断当前随机的这个号码之前是否出现过,出现过就需要重新随机,直到不重复为止
// 定义一个flag变量,默认认为data是没有重复的
boolean flag = true;
for (int j = 0; j < i; j++) {
if (numbers[j] == data){
// data当前这个数据之前出现过,不能用
flag = false;
break;
}
}
if (flag){
// data 这个数据之前没有出现过,可以使用了
numbers[i] = data;
break;
}
}
}
// d、为第7个位置生成一个1-16的号码作为篮球号码
numbers[numbers.length - 1] = r.nextInt(16) + 1;
return numbers;
}
public static int[] userInputNumber(){
// a.定义一个数组存储7个号码
int[] numbers = new int[7];
// b.让用户录入6个红球号码
Scanner sc = new Scanner(System.in);
for (int i = 0; i < numbers.length -1 ; i++) {
System.out.println("请你输入第" + (i + 1)+"个红球号码(1-33)不重复:");
int data = sc.nextInt();
// c.将当前录入的i个数据存储到数组中
numbers[i] = data;
}
// d. 然后录入一个蓝球的号码
System.out.println("请你输入蓝球号码(1-16):");
numbers[6] = sc.nextInt();
return numbers;
}
public static void judge(int[] luckNumbers, int[] userNumbers ) {
//判断是否中奖了
// 1.定义两个变量分别存储红球命中的个数,以及蓝球命中的个数
int redHitNumbers = 0;
int blueHitNumbers = 0;
//2.判断红球命中了几个,开始统计
for (int i = 0; i < userNumbers.length - 1; i++) {
for (int j = 0; j < luckNumbers.length - 1; j++) {
//每次找到了相等,表示当前号码命中了
if (userNumbers[i] == luckNumbers[j]) {
redHitNumbers++;
break;
}
}
}
// 蓝球号码是否命中了?
blueHitNumbers = luckNumbers[6] == userNumbers[6] ? 1 : 0;
System.out.println("中奖号码是:");
System.out.println(luckNumbers);
System.out.println("你投注号码是:");
System.out.println(userNumbers);
System.out.println("你命中了几个红球:" + redHitNumbers);
System.out.println("你是否命中蓝球:" + (blueHitNumbers == 1 ? "是":"否"));
// 判断中奖情况
if (blueHitNumbers == 1 && redHitNumbers < 3) {
System.out.println("恭喜你,中了5元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 3 || blueHitNumbers == 0 && redHitNumbers == 4) {
System.out.println("恭喜你,中了10元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 4 || blueHitNumbers == 0 && redHitNumbers == 5) {
System.out.println("恭喜你,中了200元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 5) {
System.out.println("恭喜你,中了3000元奖");
} else if (blueHitNumbers == 0 && redHitNumbers == 6) {
System.out.println("恭喜你,中了五百万元奖");
} else if (blueHitNumbers == 1 && redHitNumbers == 6) {
System.out.println("恭喜你,中了一千万元奖");
} else{
System.out.println("你没有中奖");
}
}
}
运行结果:
E:\java\jdk-11.0.9\bin\java.exe "-javaagent:E:\soft\IntelliJ IDEA 2019.1.4\lib\idea_rt.jar=52660:E:\soft\IntelliJ IDEA 2019.1.4\bin" -Dfile.encoding=UTF-8 -classpath E:\java\example\out\production\Array3 Case.Test2
请你输入第1个红球号码(1-33)不重复:
7
请你输入第2个红球号码(1-33)不重复:
8
请你输入第3个红球号码(1-33)不重复:
9
请你输入第4个红球号码(1-33)不重复:
10
请你输入第5个红球号码(1-33)不重复:
11
请你输入第6个红球号码(1-33)不重复:
12
请你输入蓝球号码(1-16):
13
中奖号码是:
[I@396a51ab
你投注号码是:
[I@51081592
你命中了几个红球:1
你是否命中蓝球:否
你没有中奖
Process finished with exit code 0
结束语:
这个最后一个例子缺少一个方法将中奖号码的地址转变成数组,今天出去做核酸了,所以只做了一部分,今天就到这里了。明天见。