要求:输入密码(大于0),编程实现加密和解密,并输出加密后和解密后的密码
加密规则:每一位先加5,再对10取余,最后将所有数字反转得到加密后的密码
1、得到密码
因为加密规则是对密码的每一位数字进行操作,所以可以将密码的每一位拆开存进数组再进行后续操作
代码如下:
Scanner sc=new Scanner(System.in);
System.out.println("请输入密码:");
int x=sc.nextInt();
int password=x;
int count=0;
//计算密码的位数
while(x!=0){
x=x/10;
count++;
}
int[] num=new int[count];
int index=0;//定义变量存放数组的索引值
//将密码的每一位数字存进数组并反转
while(password!=0){
int ge=password%10;
password=password/10;
num[index]=ge;
index++;
}
这里提前进行了反转是因为加密是作用于密码的每一位数的,所以先反转再加密和先加密再反转结果相同。但是还是建议大家养成按照题目要求一步步来的习惯,这样思路不容易混乱
2、进行加密
这一步比较简单就直接给代码不做说明了
代码如下:
//加密
for (int i = 0; i < num.length; i++) {
num[i]=(num[i]+5)%10;
}
//得到加密后的密码encrypt
int encrypt=0;
for (int i = 0; i < num.length; i++) {
encrypt=encrypt*10+num[i];
}
System.out.println("加密后密码为:"+encrypt);
3、进行解密
解密只需将加密后的密码先进行反转,然后每一位数还原对10取余,最后每一位减5就可以得到原密码。
这一步只有还原对10余的步骤需要思考,对0-9这十个数字进行+5再%10:
原型:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+5后得:
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
%10后得:
5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 |
发现对10取余操作后的数字中,0-4加10就能还原到取余前的数字,而5-9取余前后不变,所以只需对[0,4]中的数字进行取余的还原操作。
代码如下:
//解密
//反转数组
for(int i=0,j=num.length-1;i<j;i++,j--){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
//还原对10取余的步骤
for (int i = 0; i < num.length; i++) {
if(num[i]>=0 && num[i]<=4){
num[i]=num[i]+10;
}
}
//还原+5的步骤
for (int i = 0; i < num.length; i++) {
num[i]=num[i]-5;
}
//得到解密后的密码decrypt
int decrypt=0;
for (int i = 0; i < num.length; i++) {
decrypt=decrypt*10+num[i];
}
System.out.println("解密后得到原密码为:"+decrypt);
完整代码如下:
import java.util.Scanner;
public class p1 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入密码:");
int x=sc.nextInt();
int password=x;
int count=0;
//计算密码的位数
while(x!=0){
x=x/10;
count++;
}
int[] num=new int[count];
int index=0;
//将密码的每一位数字存进数组并反转
while(password!=0){
int ge=password%10;
password=password/10;
num[index]=ge;
index++;
}
//加密
for (int i = 0; i < num.length; i++) {
num[i]=(num[i]+5)%10;
}
//得到加密后的密码encrypt
int encrypt=0;
for (int i = 0; i < num.length; i++) {
encrypt=encrypt*10+num[i];
}
System.out.println("加密后密码为:"+encrypt);
//解密
//反转数组
for(int i=0,j=num.length-1;i<j;i++,j--){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
//还原对10取余的步骤
for (int i = 0; i < num.length; i++) {
if(num[i]>=0 && num[i]<=4){
num[i]=num[i]+10;
}
}
//还原+5的步骤
for (int i = 0; i < num.length; i++) {
num[i]=num[i]-5;
}
//得到解密后的密码decrypt
int decrypt=0;
for (int i = 0; i < num.length; i++) {
decrypt=decrypt*10+num[i];
}
System.out.println("解密后得到原密码为:"+decrypt);
}
}
运行结果:
请输入密码:
18703
加密后密码为:85236
解密后得到原密码为:18703