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

JAVAsha256解密_游戏

参考代码如下:

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;
        }
    }
}