练习六:数字加密
需求:
某系统的数字密码(大于0),比如1983,采用加密方式进行传输。
规则如下:
先得到每位数,然后每位数都加上5 , 再对10求余,最后将所有数字反转,得到一串新数。
举例:
1 9 8 3
+5 6 14 13 8
%10 6 4 3 8
反转 8 3 4 6
加密后的结果就是:8346
代码示例:
package com.iflytek.day09;
import java.util.Scanner;
/**
* 某系统的数字密码(大于0)。比如1983,采用加密方式进行传输,
* 规则如下:
* 每位数加上5
* 再对10求余,
* 最后将所有数字反转,
* 得到一串新数。
*/
public class Test6 {
public static void main(String[] args) {
//1.把整数里面的每一位放到数组当中
int[] arr = {1, 9, 8, 3};
//2.加密
//每位数加上5
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] + 5;
}
//再对10求余,
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] % 10;
}
//将所有数字反转
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//8 3 4 6 --> 8346
//3.把数组里面的每一个数字进行拼接,变成加密之后的结果
int number = 0;
for (int i = 0; i < arr.length; i++) {
number = number * 10 + arr[i];
}
System.out.println(number);
}
}
练习六扩展:
需求:
把一个正整数转换成数组,也就是把整数上的每一位都添加到数组当中
int number = 12345;
转换为
int[] arr = {1,2,3,4,5};
代码:
package com.iflytek.day09;
public class Test6_1 {
public static void main(String[] args) {
//反向推导
//1.计算出数组的长度
int number = 12345;
//定义一个变量临时记录number的值,就是为了第三步的时候再次使用
int temp = number;
//定义一个变量进行统计
int count = 0;
while(number != 0){
//每一次循环就去掉右边的一个数字
number = number / 10;
//去掉一位计数器就自增一次。
count++;
}
//2.定义数组
//动态初始化
int[] arr = new int[count];
//3.把整数上的每一位都添加到数组当中
int index = arr.length -1;
while(temp != 0){//12345
//获取temp里面的每一位数组
int ge = temp % 10;
//再去掉右边的那位数字
temp = temp / 10;
//把当前获取到的个位添加到数组当中
arr[index] = ge;
index--;
}
//验证结果 1 2 3 4 5
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
其它实现方式:
package com.iflytek.day09;
public class Test6_2 {
public static void main(String[] args) {
//1.整数转字符串,遍历字符串,放置到新的数组中
int number = 12345;
String numStr = String.valueOf(number);
int[] numArr = new int[numStr.length()];
for (int i = 0; i < numStr.length(); i++) {
numArr[i] = Integer.parseInt(String.valueOf(numStr.charAt(i)));
}
//验证结果 1 2 3 4 5
for (int i = 0; i < numArr.length; i++) {
System.out.print(numArr[i] + " ");
}
}
}
练习七:数字解密
需求:
把上一题加密之后的数据进行解密
比如1983加密之后变成8346,解密之后变成1983
代码示例:
package com.iflytek.day09;
/*某系统的数字密码(大于0)。比如1983,采用加密方式进行传输,
规则如下:
每位数加上5
再对10求余,
最后将所有数字反转,
得到一串新数。
按照以上规则进行解密:
比如1983加密之后变成8346,解密之后变成1983
*/
public class Test7 {
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);
}
}
练习六-七代码整合
package com.iflytek.day09;
public class Test {
public static void main(String[] args) {
int num = 1983;
// int2Arr(num);
// reverse(int2Arr(num));
int encodeNum = encode(num);
System.out.println(encodeNum);
int decodeNum = decode(encodeNum);
System.out.println(decodeNum);
}
/**
* 1. 明确参数
* 2. 明确返回值
* 3. 起一个见名知意的方法名
*/
/**
* 整数转换为数组形式
*
* @param num 待转换的整数
* @return 转换之后的数组
*/
public static int[] int2Arr(int num) {
int tempNum = num;
// 例如:num-> 12345
// 取得数字的长度
int count = 0;
while (tempNum != 0) {
tempNum = tempNum / 10;
count++;
}
// 根据数字的长度,构建出数组
int[] arr = new int[count];
// 12345%10 = 5 12345/10=1234
// 1234%10 = 4 1234/10=123
for (int i = arr.length - 1; i >= 0; i--) {
arr[i] = num % 10;
num = num / 10;
}
return arr;
}
// 2. 加密
public static int encode(int num) {
int[] arr = int2Arr(num);
// 1. +5
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] + 5;
}
// 2. %10
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] % 10;
}
// 3. 反转
arr = reverse(arr);
// 4. 数组转数字
// 1 9 8 3
String str = "";
for (int i = 0; i < arr.length; i++) {
str += arr[i];
}
return Integer.parseInt(str);
}
public static int[] reverse(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
return arr;
}
// 3. 解密
public static int decode(int num) {
int[] arr = int2Arr(num);
// 1. 反转
arr = reverse(arr);
// 2. +10
// 0-9 5-9=>10->14 0-4的需要+10
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 0 && arr[i] <= 4) {
arr[i] = arr[i] + 10;
}
}
// 3. -5
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] - 5;
}
//
String str = "";
for (int i = 0; i < arr.length; i++) {
str += arr[i];
}
return Integer.parseInt(str);
}
}
练习八:抽奖
需求:
一个大V直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序)
888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出
解法一:
package com.iflytek.day09;
import java.util.Random;
/* 需求:
一个大V直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。
请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
打印效果如下:(随机顺序,不一定是下面的顺序)
888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出
*/
public class Test8 {
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();
//因为有5个奖项,所以这里要循环5次
for (int i = 0; i < 5; ) {
//获取随机索引
int randomIndex = r.nextInt(arr.length);
//获取奖项
int prize = arr[randomIndex];
//判断当前的奖项是否存在,如果存在则重新抽取,如果不存在,就表示是有效奖项
boolean flag = contains(newArr, prize);
if(!flag){
//把当前抽取到的奖项添加到newArr当中
newArr[i] = prize;
//添加完毕之后,移动索引
i++;
}
}
//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;
}
}
解法二:
package com.iflytek.day09;
import java.util.Random;
/* 需求:
一个大V直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。
请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
打印效果如下:(随机顺序,不一定是下面的顺序)
888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出
*/
public class Test8_1 {
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]);
}
}
}
练习九:双色球
需求
由系统随机6个红球 1个蓝球,红球范围在1-33,蓝球范围在1-16,红球每个数不能重复,蓝球可以与红球重复。由用户输入7个号码,来进行判断。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4dViQULs-1684139236340)(assets\图片1.png)]
需求分析
- 生成中奖号码
- 用户输入彩票号码,校验重复情况
- 判断用户的中奖情况
代码示例:
package com.iflytek.day09;
import java.util.Random;
import java.util.Scanner;
public class Test9 {
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("\n=======================");
//2.用户输入彩票号码(红球 + 蓝球)//654321
int[] userInputArr = userInputNumber();
//3.判断用户的中奖情况
//红球 蓝球
int redCount = 0;
int blueCount = 0;
//判断红球
for (int i = 0; i < userInputArr.length - 1; i++) {
int redNumber = userInputArr[i];
for (int j = 0; j < arr.length - 1; j++) {
if(redNumber == arr[j]){
redCount++;
//如果找到了,那么后面的数字就没有必要继续比较了
//跳出内循环,继续判断下一个红球号码是否中奖
break;
}
}
}
//判断蓝球
int blueNumber = userInputArr[userInputArr.length-1];
if(blueNumber == arr[arr.length - 1]){
blueCount++;
}
//根据红球的个数以及蓝球的个数来判断中奖情况
if(redCount == 6 && blueCount == 1){
System.out.println("恭喜你,中奖1000万");
}else if(redCount == 6 && blueCount == 0){
System.out.println("恭喜你,中奖500万");
}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 < 6; ) {
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++;
} else {
//存在
System.out.println("当前红球号码已经存在,请重新输入");
}
} else {
System.out.println("当前红球号码超出范围");
}
}
//让用户输入篮球号码
System.out.println("请输入篮球号码");
//1~16
while (true) {
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.随机生成号码并添加到数组当中
//红球:不能重复的 1 2 3 4 5 6
//蓝球:可以跟红球号码重复 5
//生成红球号码并添加到数组当中
Random r = new Random();
for (int i = 0; i < 6; ) {
//获取红球号码
int redNumber = r.nextInt(33) + 1;
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;
}
}
二维数组
二维数组就是存储一维数组(内存地址/引用)的数组
二维数组其实是一位数组的嵌套(每一行看做一个内层的一维数组)
二维数组的定义
int[][] a=new int[10][10];
String[][] b=new String[10][10];
初始化二维数组
//静态初始化
int[][] a={{1,2,3,4},{4,5,6,7},{8,9,10,11}};
//动态初始化
String[][] b=new String[10][10];
b[0]=new String[]{"zahngsan","lisi","wangwu"};
b[1]=new String[]{"java","python","c++"};
二维数组的遍历
package com.iflytek.day09;
public class TwoDimensionDemo1 {
public static void main(String[] args) {
//1.二维数组静态初始化格式
//数据类型[][] 数组名 = new 数据类型[][] {{元素1,元素2},{元素1, 元素2}};
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5, 6, 7, 8}};
int[][] arr2 = {{1, 2, 3}, {4, 5, 6, 7, 8}};
//以后建议这样定义,把每一个一维数组,单独写成一行
//注意:每一个一维数组其实是二维数组中的元素,所以每一个一维数组之间需要用逗号隔开。最后一个一维数组后面不需要加逗号
int[][] arr3 = {
{1, 2, 3},
{4, 5, 6, 7, 8}
};
//2.获取元素
//arr[i][j]
//arr:二维数组
//i:二维数组的索引,获取出来的是里面的一维数组
//j:表示一维数组中的索引,获取出来的就是真正的元素
System.out.println(arr3);//表示获取二维数组中的第一个一维数组
System.out.println(arr3[0]);//表示获取二维数组中的第一个一维数组
//arr3[0]:二维数组中的第一个一维数组
//arr3[0][0]:获取第一个一维数组中0索引的元素
System.out.println(arr3[0][0]);//1
System.out.println(arr3[1][4]);//打印数字8
// System.out.println(arr3[2][0]);//ArrayIndexOutOfBoundsException
//3、二维数组遍历
//外循环:遍历二维数组,得到里面的每一个一维数组
for (int i = 0; i < arr3.length; i++) {
//i:表示二维数组中的每一个索引
//arr3[i]: 表示二维数组中的每一个元素(一维数组)
//内循环:遍历一维数组,得到里面的每一个元素
for (int j = 0; j < arr3[i].length; j++) {
//j:表示一维数组中的每一个元素
System.out.print(arr3[i][j] + " ");
}
System.out.println();
}
}
}
二维数组练习
需求:
某商城每个季度的营业额如下:单位(万元)
第一季度:22,66,44 一维数组
第二季度:77,33,88 一维数组
第三季度:25,45,65 一维数组
第四季度:11,66,99 一维数组
要求使用二维数组计算出每个季度的总营业额和全年的总营业额
代码:
package com.iflytek.day09;
/**
* 某商城每个季度的营业额如下:单位(万元)
* 第一季度:22,66,44 一维数组
* 第二季度:77,33,88 一维数组
* 第三季度:25,45,65 一维数组
* 第四季度:11,66,99 一维数组
* <p>
* 要求计算出每个季度的总营业额和全年的总营业额
*/
public class TwoDimensionDemo2 {
public static void main(String[] args) {
//1.创建二维数组并存储数据
int[][] yearArrArr = {
{22, 66, 44},
{77, 33, 88},
{25, 45, 65},
{11, 66, 99}
};
//表示全年的营业额
int yearSum = 0;
//2.遍历二维数组,得到每一个一维数组并求和
for (int i = 0; i < yearArrArr.length; i++) {
//i 二维数组中的每一个索引
//yearArrArr[i] 元素(一维数组)
int[] quarterArr = yearArrArr[i];
int sum = getSum(quarterArr);
System.out.println("第" + (i + 1) + "个季度的总营业额为:" + sum);
yearSum = yearSum + sum;
}
System.out.println("全年的总营业为:" + yearSum);
}
//定义一个方法,计算每一个季度的营业额
public static int getSum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
return sum;
}
}
三维数组练习
开启套娃模式
尝试实现:
针对下列三维数组进行遍历,并在控制台输出以下格式,注意不要多打印“,”
{
{
{1,2,3},
{4,5,6,9}
},
{
{7,8,9},
{10,11,12}
},
{
{13,14,15},
{16,17,18}
}
}
package com.iflytek.day09;
public class TwoDimensionDemo3 {
public static void main(String[] args) {
// 一维数组
int[] arr1_1 = {1, 2, 3};
int[] arr1_2 = {4, 5, 6};
int[] arr2_1 = {7, 8, 9};
int[] arr2_2 = {10, 11, 12};
int[] arr3_1 = {13, 14, 15};
int[] arr3_2 = {16, 17, 18};
// 二维数组
int[][] arr1 = new int[][]{arr1_1, arr1_2};
int[][] arr2 = new int[][]{arr2_1, arr2_2};
int[][] arr3 = new int[][]{arr3_1, arr3_2};
// 三维数组
int[][][] array1 = new int[][][]{arr1, arr2, arr3};
int[][][] array2 = {
{{1, 2, 3}, {4, 5, 6}},
{{7, 8, 9}, {10, 11, 12}},
{{13, 14, 15}, {16, 17, 18}}
};
//三维数组遍历
System.out.println("{");
for (int i = 0; i < array1.length; i++) {
System.out.println(" {");
for (int j = 0; j < array1[i].length; j++) {
System.out.print(" {");
for (int k = 0; k < array1[i][j].length; k++) {
//j:表示一维数组中的每一个元素
System.out.print(array1[i][j][k]);
if (k != array1[i][j].length - 1) {
System.out.print(",");
}
}
if (j != array1[i].length - 1) {
System.out.println("},");
} else {
System.out.println("}");
}
}
if (i != array1.length - 1) {
System.out.println(" },");
} else {
System.out.println(" }");
}
}
System.out.println("}");
}
}
rintln(" {“);
for (int j = 0; j < array1[i].length; j++) {
System.out.print(” {“);
for (int k = 0; k < array1[i][j].length; k++) {
//j:表示一维数组中的每一个元素
System.out.print(array1[i][j][k]);
if (k != array1[i][j].length - 1) {
System.out.print(”,“);
}
}
if (j != array1[i].length - 1) {
System.out.println(”},“);
} else {
System.out.println(”}“);
}
}
if (i != array1.length - 1) {
System.out.println(” },“);
} else {
System.out.println(” }“);
}
}
System.out.println(”}");
}
}