輸入四位整數,加密規則:
int n = scanner.nextInt(); // 假設已驗證 1000-9999
int d1 = n / 1000;
int d2 = n / 100 % 10;
int d3 = n / 10 % 10;
int d4 = n % 10;
d1 = (d1 + 5) % 10;
d2 = (d2 + 5) % 10;
d3 = (d3 + 5) % 10;
d4 = (d4 + 5) % 10;
int encrypted = d4 * 1000 + d3 * 100 + d2 * 10 + d1;
System.out.println(encrypted);
缺點:位數固定,擴充至 5/6 位需大量複製修改程式碼。
public static int encrypt(int number, int digits) {
int[] arr = new int[digits];
// 1. 從低位到高位拆解存入陣列
for (int i = 0; i < digits; i++) {
arr[i] = number % 10;
number /= 10;
}
// 2. 位移 +5 %10
for (int i = 0; i < digits; i++) {
arr[i] = (arr[i] + 5) % 10;
}
// 3. 交換對稱位置 (i <-> digits-1-i)
for (int i = 0; i < digits / 2; i++) {
int tmp = arr[i];
arr[i] = arr[digits - 1 - i];
arr[digits - 1 - i] = tmp;
}
// 4. 重組數字
int result = 0;
for (int i = digits - 1; i >= 0; i--) {
result = result * 10 + arr[i];
}
return result;
}
// 測試
System.out.println(encrypt(1234, 4)); // 輸出加密結果
System.out.println(encrypt(12345, 5)); // 直接支援 5 位
| 步驟 | 陣列索引對應 | 說明 |
|---|---|---|
| 拆解 | arr[0] = 個位, arr[1] = 十位... | 自然對應取模/除法順序 |
| 位移 | 同索引 | 獨立運算,無相依 |
| 交換 | i ↔ len-1-i | 雙指標對稱交換,通用奇/偶長度 |
| 重組 | 高位到低位累乘 10 | 還原十進制數值 |
加密可逆,解密步驟反向:
(digit + 10 - 5) % 10 即 (digit + 5) % 10 (因 10-5=5,自逆)。發現:此加密自逆,加密兩次即還原,因 (x+5)%10 為自逆函數,交換兩次也還原。