今天和大家分享的是一道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]+" ");
}
今天的分享就到这里,如果大家有什么好的意见或者文章有什么错误,欢迎各位大神指点。