輸入一個五位整數,按以下規則加密:
(digit + 6) % 8)原始數字:d1 d2 d3 d4 d5 (d1 為萬位,d5 為個位)
步驟 1:拆解數字到陣列 a[0..4]
a[0] = d5 (個位)
a[1] = d4 (十位)
a[2] = d3 (百位)
a[3] = d2 (千位)
a[4] = d1 (萬位)
→ 陣列索引 0 對應個位,方便後續處理
步驟 2:加密變換
for i = 0..4:
a[i] = (a[i] + 6) % 8
步驟 3:位置交換
swap(a[0], a[4]) // 個位 ↔ 萬位
swap(a[1], a[3]) // 十位 ↔ 千位
// a[2] (百位) 不動
步驟 4:重組結果
result = a[4]*10000 + a[3]*1000 + a[2]*100 + a[1]*10 + a[0]
#include <stdio.h>
#include <stdlib.h>
#define N 5
// 將五位整數拆解到陣列,索引 0 為個位
void decompose(int num, int digits[N]) {
for (int i = 0; i < N; ++i) {
digits[i] = num % 10;
num /= 10;
}
}
// 加密變換:(digit + 6) % 8
void encrypt_transform(int digits[N]) {
for (int i = 0; i < N; ++i) {
digits[i] = (digits[i] + 6) % 8;
}
}
// 位置交換:1↔5, 2↔4 (陣列索引 0↔4, 1↔3)
void swap_positions(int digits[N]) {
int t = digits[0]; digits[0] = digits[4]; digits[4] = t;
t = digits[1]; digits[1] = digits[3]; digits[3] = t;
}
// 陣列重組為整數
int compose(const int digits[N]) {
int result = 0;
for (int i = N - 1; i >= 0; --i) {
result = result * 10 + digits[i];
}
return result;
}
int encrypt_number(int num) {
int digits[N];
decompose(num, digits);
encrypt_transform(digits);
swap_positions(digits);
return compose(digits);
}
int main() {
int input;
printf("請輸入一個五位整數:");
if (scanf("%d", &input) != 1) return 1;
// 驗證輸入為五位正整數 (10000-99999)
if (input < 10000 || input > 99999) {
printf("Error Data: 輸入必須為五位正整數\n");
return 1;
}
int encrypted = encrypt_number(input);
printf("加密結果:%05d\n", encrypted); // %05d 補齊前導零
return 0;
}
| 輸入 | 拆解 | +6%8 | 交換後 | 輸出 |
|---|---|---|---|---|
| 12345 | [5,4,3,2,1] | [3,2,1,0,7] | [7,0,1,2,3] | 70123 |
| 99999 | [9,9,9,9,9] | [7,7,7,7,7] | [7,7,7,7,7] | 77777 |
| 10000 | [0,0,0,0,1] | [6,6,6,6,7] | [7,6,6,6,6] | 76666 |
| 56789 | [9,8,7,6,5] | [7,6,5,4,3] | [3,4,5,6,7] | 34567 |
題目提供的代碼存在多個問題:
#include"stdio.h" → 應為 <stdio.h>int a[N] 耦合度高,函數間隱性依賴copy 函數邏輯混亂:a[N-i-1] = d%10 實際上是逆序存放,但迴圈條件與索引運算易出錯void main() 非標準,應為 int main()getch() 非標準 (conio.h),可移植性差if(d<=9999) 不完整,未檢查上界 99999%05d 保證五位輸出含前導零。conio.h、getch(),純 stdio.h,跨平台編譯。(x+6)%8 在模 8 下可逆(逆運算:(y+2)%8),交換操作也是自逆的。