一、数字加密
需求:某系统的数字密码(大于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.itheima.test;
public class Test6 {
public static void main(String[] args) {
/*
某系统的数字密码(大于0)。比如1983,采用加密方式进行传输,
规则如下:
每位数加上5
再对10求余,
最后将所有数字反转,
得到一串新数。
*/
//分析:
//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);
}
}
扩展:把整数上的每一位都添加到数组当中
package com.itheima.test;
public class Test7 {
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] + " ");
}
}
}
二、数字解密
把上一题加密之后的数据进行解密
难点:
%10
如何反过来?这个需要结合前面的+5
来看。每位的位数范围在
0 ~ 9
,+5
后范围在5 ~ 14
,取余后,5 ~ 9
就是本身,而10 ~ 15
取余后去掉了一个10。因此在还原的时候,如果是
0 ~ 4
之间的数字,就需要将这个10补回来。
代码示例:
package com.itheima.test;
public class Test8 {
public static void main(String[] args) {
/*某系统的数字密码(大于0)。比如1983,采用加密方式进行传输,
规则如下:
每位数加上5
再对10求余,
最后将所有数字反转,
得到一串新数。
按照以上规则进行解密:
比如1983加密之后变成8346,解密之后变成1983
*/
//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);
}
}