分享一个简单不烧脑却又有趣的小游戏。数字加密,利用JAVA实现数字的加密与解密。
需求:输入一个4位数字(大于0),比如1983,输出加密后的数字。
规则(加密规则):先得到每一位数,再将每一位数+5,在对每一位数字10取余,最后将数字进行反转,得到一串新的数字,就是加密后的数字了。
例子如下: /* * 1 9 8 3 * +5 6 14 13 8 * %10 6 4 3 8 * 反转 8 3 4 6 * 加密后的新数字:8346 */
分享一下我的解题思路:
1.从需求开始,需求是要输入一个数字,这简单定义一个整形变量n,再用Scanner给n赋值。不过这里还有个要求就是要大于0,所以我们输入数据时得判断一下输入的数字是否大于0,如果不是那就重新输入,直到输入的数字大于0为止。
2.接下来就是最重要的部分了,给数字加密三层。既然是对每一位数字进行操作,那么我们得把每一位求出来,办法就很多了,比如利用%10的方式就可以求出每一位数字,或者数组。这里我用选用数组的方式。
3.每一位求出来后,就是加密了,利用循环给每一位数字进行+5,%10就可以了,然后再将数组元素反转,再将数组转换为整数就可以了。
大体思路就是这样,先自己按我的思路做一遍试试,再自己优化优化,改进代码.
这题我认为唯一,一个难点就是解密时如何恢复到%10。
如下图:可以看出,我们逆推得出,如果是个位数字的话,%10它的结果就是他本身。两位数的%10结果就是个位数。
图中5~14表示每位数字一定是在这个区间内的,因为,第一层加密就是+5了,所以每一位最小是5,最大是14。
参考代码如下:
import java.util.Scanner; public class NumberEncrypt { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int Number; while (true) { System.out.print("输入一个4位数字:"); Number = sc.nextInt(); if (Number > 0) break; else System.out.println("输入错误!"); } //将每一位数字存放在数组 int[] NumberArray = new int[4]; //利用方法获取每个数字,存放在数组里 getEachDigit(Number, NumberArray); //数据加密一二层 for (int i = 0; i < NumberArray.length; i++) { NumberArray[i] += 5; NumberArray[i] %= 10; } //数字反转(利用双指针方式) for (int i = 0, j = NumberArray.length - 1; i < j; i++, j--) { int tmp = NumberArray[i]; NumberArray[i] = NumberArray[j]; NumberArray[j] = tmp; } System.out.print("加密后:"); //加密后数字输出 for (int x : NumberArray) { System.out.print(x); } //数据解密 //反转 for (int i = 0, j = NumberArray.length - 1; i < j; i++, j--) { int tmp = NumberArray[i]; NumberArray[i] = NumberArray[j]; NumberArray[j] = tmp; } //解密一二层 for (int i = 0; i < NumberArray.length; i++) { //个位数%10是本身,两位数%10结果是个位数 if (NumberArray[i] >= 0 && NumberArray[i] <= 4) NumberArray[i] += 10; NumberArray[i] -= 5; } System.out.print("\n解密后:"); //输出解密答案 for (int x : NumberArray) { System.out.print(x); } } //获取每位数字(将数字每一位获取后,存放在数组里) public static void getEachDigit(int num, int[] b) { //Integer.toString:将数字转化为字符串 String numStr = String.valueOf(num); for (int i = 0; i < numStr.length(); i++) { //.charAt(下标):将字符串每一位以字符形式拿出来 //字符串不能直接输出每一位字符,得用函数配合使用 int digit = numStr.charAt(i) - '0'; b[i] = digit; } } }