Java数字加密

今天和大家分享的是一道Java数字加密的题目,题目要求如下:

某系统数字密码(大于0),比如1983,以加密方式进行传输
加密规则:
每位数字+5;
再对10求余;
最后将所有数字反转,得到一串全新的数字
看到这个题目,我们先确定好我们自己的思路:将这个题目分解成两个部分,一个是用户输入数据的部分,一个是密码进行加密的部分;用户输入部分可以使用数组来存储,加密部分则利用for循环遍历获取具体数据并进行加密操作。

首先,我们先来创建一个创建数组的方法:

public static int[] getCipher(){

}

整个创建数组实现的代码如下:

public static int[] getCipher(){
        int[] ciphers=new int[4];
        Scanner sc=new Scanner(System.in);
        for (int i = 0; i < ciphers.length; ) {
            System.out.println("请分别输入四位数字密码:");
            int cipher=sc.nextInt();
            if (cipher>=0&&cipher<10){
                ciphers[i]=cipher;
                i++;
            }else {
                System.out.println("您输入的数据有误,请重新输入,当前I为"+i);
            }
        }
        return ciphers;
    }
}

 如上代码,在方法定义时,因为我们用的数组去接收用户自定义的数据,所以返回值是int型。这里调用new方法创建一个长度为4的数组,再调用Scanner方法来接收用户自定义的数据。我们利用for循环将数组初始化。但是,这是又有一个问题:用户输入错误(比如1000,10000)怎么办呢?在此处,有一个小技巧:将for循环中的i++放到下面的if判断语句中

if (cipher>=0&&cipher<10){
                ciphers[i]=cipher;
                i++;
            }else {
                System.out.println("您输入的数据有误,请重新输入,当前I为"+i);
            }

运行代码我们便可以看到如下的效果:

当我们按照if判断语句中的条件执行,数据符合条件,执行i++,不符合,则跳过i++的执行,用户输入的错误数据不会被保存在数组里面,而是停留在当前i的位置。

数组创建部分就先到这里了,接下来就是加密部分了。

首先创建一个方法:

 public static void codePlus(int[] codeArr){

}

后面加密我们使用for循环来遍历每个数据并进行操作:

        //每个数字+5
        for (int i = 0; i < codeArr.length; i++) {
            codeArr[i]+=5;
        }
        //每个数字对10求余
        for (int j = 0; j < codeArr.length; j++) {
            codeArr[j]=codeArr[j]%10;
        }
        //将数据进行反转
        for (int k=codeArr.length-1,l=0;l<codeArr.length;k--) {
            int sum;
            sum=codeArr[l];
            codeArr[l]=codeArr[k];
            codeArr[k]=sum;
            l++;
        }

其实这段代码有一个小错误,在最后一个for循环的条件中,l<codeArr.length这个条件其实是达不到我们想要的效果的(结合下图):数组长度为4,按照l<codeArr.length的条件执行,第一遍(对应图2)运行,首尾值互换,l++,k--;第k--二遍(对应图3),下标1,2值互换,l++,k--。此时我们已经获得了我们想要的效果,但是这个循环并不会停下而是进行了第三遍(对应图4),这才是这个代码的最终效果,但这并不是我们想要的。

那我们应该怎么解决呢?其实很简单,看到图2与图3之间的值互换,我们可以发现当l<k时,整个代码便已经达到了我们想要的效果,所以,我们可以将for循环中的条件l<codeArr.length改为l<k,

for (int k=codeArr.length-1,l=0;l<k;k--) {
            int sum;
            sum=codeArr[l];
            codeArr[l]=codeArr[k];
            codeArr[k]=sum;
            l++;
        }

整个问题便解决了。

在这段实现值互换的代码中还有一个小心思和大家分享,就是“双指针”(此双指针非C语言中的双指针,而是思路类似,故取名“双指针”)思想

for (int k=codeArr.length-1,l=0;l<k;k--) {
            int sum;
            sum=codeArr[l];
            codeArr[l]=codeArr[k];
            codeArr[k]=sum;
            l++;
        }

首先,我们将k的值定义为数组的最后一个值的下标,再定义一个sum接收下标为0的数组值,codeArr[0]的值被codeArr[3]的值覆盖,l向右走一位,k向左走一位,以此实现数组值的互换。

最后,我们来调用定义的方法:

        //创建数组接收
        int[] codeArr=getCipher();
        //将数组的值传入方法,求出按规则加密的密码
        codePlus(codeArr);

以for循环遍历数组,输出最终结果:

//最后输出加密密码
        System.out.println("密码是:");
        for (int i = 0; i < codeArr.length; i++) {
            System.out.print(codeArr[i]+" ");
        }

今天的分享就到这里,如果大家有什么好的意见或者文章有什么错误,欢迎各位大神指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@玲鑫@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值