数据加密问题
1、问题
某个公司采用公用电话传递数据信息,数据是小于9位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。 请任意给定一个小于9位的整数,然后,把加密后的结果在控制台打印出来。
2、难点:数据长度不固定。
3、要求(以123456为例)
(1)数据是小于8位的整数
int number = 123456
(2)加密规则:
a: 首先将数据逆序
654321
b: 将每位数字都加上5,再用和除以10的余数代替该数字
109876
c: 最后将第一位和最后一位数字交换
609871
(3)把加密后的结果在控制台打印出来
4、分析过程
(2)赋值数组
可以采用for循环除10取余的方法获取每一位的数字,
传入数组。
代码:
int[] arr = new int[8];
int j = 1;
for (int i = arr.length-1; i >=0; i--) {
arr[i] = (number / j) % 10;
j *= 10;
}
问题:无法确定键盘录入数据的位数。数组长度设置为最大8,
数组中会有多余的0元素。
解决:采用for循环找到第一个不为0的数字索引,
设置为索引0,
代码:
int k = 0;
for (int i = 0; i < 8; i++) {
if (arr[i] != 0) {
k = i;
break;
}
}
int[] arr1 = new int[arr.length - k];
for (int i = k; i < 8; i++) {
arr1[i - k] = arr[i];
}
注意:k需要在循环外定义初始化(作用域问题)
(3)数组逆序
简单,三段式逆序(个人记忆):
中间值=首数据
首数据=尾数据
尾数据=中间值
速记:从右往左从上往下次序是首中尾
代码:
for (int i = 0; i < arr1.length / 2; i++) {
int temp = arr1[i];
arr1[i] = arr1[arr1.length - 1 - i];
arr1[arr1.length - 1 - i] = temp;
}
(4)加密赋值
for循环即可
代码:
for (int i = 0; i < arr1.length; i++) {
arr1[i] = (arr1[i] + 5) % 10;
}
int temp3 = arr1[0];
arr1[0] = arr1[arr1.length - 1];
arr1[arr1.length - 1] = temp3;
(5)键盘录入,错误输出报错并重新输入
采用导包,if+while循环即可
代码:
import java.util.Scanner;
......
while (flag) {
number = sc.nextInt();
System.out.println("原数据:" + number);
if (number > 99999999) {
System.out.println("输入错误!请重新输入:");
continue;
}
flag = false;
}
5、总代码:
*/
import java.util.Arrays;
import java.util.Scanner;
public class HomeWork05 {
public static void main(String[] args) {
System.out.println("请输入一个不大于八位的数:");
Scanner sc = new Scanner(System.in);
boolean flag = true;
int number = 0;
//错误输入报错
while (flag) {
number = sc.nextInt();
System.out.println("原数据:" + number);
if (number > 99999999) {
System.out.println("输入错误!请重新输入:");
continue;
}
flag = false;
}
//赋值数组 []arr={00123456}
int[] arr = new int[8];
int j = 1;
for (int i = arr.length-1; i >=0; i--) {
arr[i] = (number / j) % 10;
j *= 10;
}
//去掉0
int k = 0;
for (int i = 0; i < 8; i++) {
if (arr[i] != 0) {
k = i;
break;
}
}
int[] arr1 = new int[arr.length - k];
for (int i = k; i < 8; i++) {
arr1[i - k] = arr[i];
}
//逆序[]arr1={654321}
for (int i = 0; i < arr1.length / 2; i++) {
int temp = arr1[i];
arr1[i] = arr1[arr1.length - 1 - i];
arr1[arr1.length - 1 - i] = temp;
}
for (int i = 0; i < arr1.length; i++) {
arr1[i] = (arr1[i] + 5) % 10;
}
int temp3 = arr1[0];
arr1[0] = arr1[arr1.length - 1];
arr1[arr1.length - 1] = temp3;
System.out.print("数据加密后:");
for (int i = 0; i < arr1.length; i++) {
System.out.print(+arr1[i]);
}
}
}