分享一个简单不烧脑却又有趣的小游戏。数字加密,利用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;
}
}
}