java练习17

题目:
某系统的数字密码(大于0),比如1983。

1. 采用加密方式进行传输

规则是:先得到每一位数字,然后每位数都加5,再对10求余,最后将所有数字反转,得到一串新数。

2. 将上述结果解密

代码:

import java.util.Scanner;

public class IncodeTest{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入数字密码");
		int x = sc.nextInt();

		int[] code = getArr(x); //存为数组
		System.out.println("存为数组里是");
		showArr(code);

		int[] incode2 = Incode(code); //编码
		System.out.println("编码加密结果是");
		showArr(incode2);

		//下面语句会将数组重新转化为int型,但是密码的末位是5会被吞
		// int incode = arr2Num(incode2);

		int[] descode2 = Descode(incode2); //解码
		System.out.println("解密结果是");
		showArr(descode2);
		
		
	}

	//获取密码长度,注意Math.pow是double类型
	private static int getLen(int x){
		int len = 0;
		while ((int)(x / (Math.pow(10, len))) != 0){
			len++;
		}
		return len;
	}

	//密码存为数组
	private static int[] getArr(int x){
		int len = getLen(x); //获取密码长度
		int[] code = new int[len];
		for (int i = len - 1; i >= 0; i--){
			int temp = (int)(x / Math.pow(10, len - i -1));
			code[i] = temp % 10;
		}
		return code;
	}

	//展示数组
	private static void showArr(int[] x){
		for (int i = 0; i < x.length; i++){
			System.out.print(x[i]);
		}
		System.out.println();
	}

	//数组转数字
	private static int arr2Num(int[] x){
		int y = x[0];
		for (int i = 1; i < x.length; i++){
			y = y * 10 + x[i];
		}
		return y;
	}

	//编码
	private static int[] Incode(int[] code){
		for (int i = 0; i <code.length; i++){
			code[i] = (code[i] + 5) % 10;
		}
		for (int i = 0, j = code.length - 1; i < j; i++, j--){
			int temp = code[i];
			code[i] = code[j];
			code[j] = temp;
		}
		return code;
	}

	//解码
	private static int[] Descode(int[] code){
		for (int i = 0; i <code.length; i++){
			if (code[i] < 5)
				code[i] += 10;
			code[i] -= 5;
		}
		for (int i = 0, j = code.length - 1; i < j; i++, j--){
			int temp = code[i];
			code[i] = code[j];
			code[j] = temp;
		}
		return code;
	}
}

试运行:

请输入数字密码
86701237
存为数组里是
86701237
编码加密结果是
28765213
解密结果是
86701237

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值