数字加密和解密

要求:输入密码(大于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:

原型:

0123456789

+5后得:

567891011121314

%10后得:

5678901234

发现对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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值