黑马程序员——数据加密问题的两种实现方式

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

问题:某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:

 首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字, 最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数, 然后,把加密后的结果在控制台打印出来。

分析:本题的难点是如何把键盘录入的数据转化为int类型的数组类进行处理,以下提供了两种解决方案:分别是接收String类型的数据和接收int类型的数据。

实现:

import java.util.Scanner;

/*
 * 	某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,
 在传递过程中需要加密,加密规则如下:
 首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,
 最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,
 然后,把加密后的结果在控制台打印出来。
 分析:
 键盘录入数据
 写一个方法给数据加密
 首先键盘录入一个8位数并想办法存入一个int类型的数组中
 然后按要求对数组中的数操作
 输出加密后的数据
 */
public class Encrypt {

	public static void main(String[] args) {
		// 键盘录入一个8位数
		// 用什么类型的数据来接收呢,我们写两个方法一个接收的是int类型,另一个接收的是String类型
		Scanner sc = new Scanner(System.in);
		System.out.println("请录入一个不大于8位的整数:");
		String str = sc.nextLine();
		// 写一个接收String类型的加密方法
		String line2 = enctypt2(str);
		System.out.println(line2);
		System.out.println("------------------");
		
		System.out.println("请再次录入刚才的数据:");
		int num = sc.nextInt();
		// 写一个接收int类型数据的加密方法
		String line = enctypt(num);
		System.out.println(line);

	}

	private static String enctypt2(String str) {
		/*
		 * 刚才的难点是如何得到各位上的数并存储到数组中,以及index的使用 本题的难点是,如何把String类型的数据转换为int类型的数组
		 * 分析: 可以先得到char数组,遍历数组得到每个字符,并转化为String类型 然后再通过String类型转换为int类型存入另一个数组中
		 */
		char[] chs = str.toCharArray();
		// 定义一个与chs等长的int数组
		int[] is = new int[chs.length];
		// 遍历chs数组得到每个元素,先转化为String类型然后再转换为int类型,存入is中
		for (int x = 0; x < chs.length; x++) {
			is[x] = Integer.parseInt(String.valueOf(chs[x]));
		}
		// 至此,int数组创建完毕,且此时是正序,将数据倒序
		for (int start = 0, end = is.length-1; start < end; start++, end--) {
			int temp = is[start];
			is[start] = is[end];
			is[end] = temp;
		}
		// 将每位数字都加上5,再用和除以10的余数代替该数字
		for (int x = 0; x < is.length; x++) {
			is[x] += 5;
			is[x] %= 10;
		}
		// 将第一位和最后一位数字交换
		int temp = is[0];
		is[0] = is[is.length - 1];
		is[is.length - 1] = temp;
		// 用字符串拼接结果
		StringBuilder sb = new StringBuilder();
		for (int x = 0; x < is.length; x++) {
			sb.append(is[x]);
		}
		return sb.toString();
	}

	private static String enctypt(int num) {
		/*
		 * 分析: 如何把一个int类型的数据转换为一个int类型的数组 我们要得到的是各位上的数,可以使用%10取余的方式获取个位数,
		 * 然后除以10再次%10取余得到十位数 如此循环下去,直到除后的数不大于1
		 */
		// 首先定义一个int数组
		// 因为最大数是8位数,所以我们定义一个长度为8的数组,然后再定义一个最大索引index
		// 我们操作时,只操作到最大数组即可
		int arr[] = new int[8];
		// 得到各位上的数并赋值给int数组
		int index = 0;
		while (num >= 1) {
			arr[index] = num % 10;
			num /= 10;
			index++;
		}
		// 此时的index等于数组的实际已经被赋值的个数
		// 此时已经得到了int数组,且已经完成了倒序
		// 将每位数字都加上5,再用和除以10的余数代替该数字

		// for (int i : arr) {
		// i += 5; 这里的增强for为什么不能用呢???????
		// i %= 10;
		// }

		for (int x = 0; x < index; x++) {
			arr[x] += 5;
			arr[x] %= 10;
		}
		// 将第一位和最后一位数字交换
		int temp = arr[0];
		arr[0] = arr[index - 1];
		arr[index - 1] = temp;
		// 用字符串拼接结果
		StringBuilder sb = new StringBuilder();
		for (int x = 0; x < index; x++) {
			sb.append(arr[x]);
		}
		return sb.toString();
	}
}
容易出现的问题和难点:

A:键盘录入的问题,当只创建一个Scanner对象时,要先录入String类型,然后录入int类型。

B:字符串转int数组难点:is[x] = Integer.parseInt(String.valueOf(chs[x]));

C:int类型数据转int数组的难点,index的使用

你可能感兴趣的:(经典案例)