4 個數據位 d1,d2,d3,d4 和 3 個校驗位 p1,p2,p3。校驗關系:
輸入 7 位(可能含 1 個錯誤),輸出糾正後的正確海明碼。保證輸入要么正確,要么僅 1 位錯誤。
計算綜合症:
s1 = (d2+d3+d4 - p1) % 2
s2 = (d1+d3+d4 - p2) % 2
s3 = (d1+d2+d4 - p3) % 2
(s3,s2,s1) 作為二進制數指出錯誤位置(1~7),0 表示無錯誤。但本題只需枚舉修正:
#include <iostream>
using namespace std;
bool check(int a1,int a2,int a3,int a4, int b1,int b2,int b3) {
return (a1+a2+a4)%2==b3 && (a1+a3+a4)%2==b2 && (a2+a3+a4)%2==b1;
}
int main() {
int a[7];
while (cin>>a[0]) {
for (int i=1;i<7;++i) cin>>a[i];
if (check(a[0],a[1],a[2],a[3], a[4],a[5],a[6])) {
for (int i=0;i<7;++i) { if(i) cout<<' '; cout<
關鍵細節
- 校驗方程對應:注意輸入順序:前 4 位 d1..d4,後 3 位 p1..p3(題目圖示順序)。代碼中
b1=p1, b2=p2, b3=p3。
- 枚舉修正:僅 7 種可能,暴力枚舉極簡且不易出錯。
- 輸出格式:空格分隔,換行結束。
複雜度
- 時間:O(1) 每測試用例。
總結
URAL Hamming Code 是海明碼單錯誤糾正的直接實現。枚舉法雖非標準綜合症解碼,但利用題目「至多 1 位錯誤」約束,代碼極短、邏輯清晰、零邊界錯誤。理解海明碼校驗位覆蓋關系(每校驗位覆蓋特定數據位子集),是設計檢查函數的關鍵。