Hamming Codes

来源:互联网 发布:java 的remainder 编辑:程序博客网 时间:2024/05/15 06:38

题意:按照从小至大的顺序输出N个B位的数,每个数与其他的数之间的Hamming距离至少为D。如果有多解,你的程序要输出这样的解:假如把它化为2^B进制数,它的值要最小。


解题思路

  1. 读入输入
  2. 建立一个数组用来保存满足条件的序列,首先加入0这个数
  3. 从1开始遍历到2^B
  4. 对每个遍历到的数,检查其与数组中已经存在的所有数的Hamming距离(两个数XOR的结果中1的个数即为Hamming距离),满足条件则将其加入数组
  5. 遍历过程中,一旦数组中加入的数量达到N,则结束遍历
  6. 输出结果

代码

/*ID: zc.rene1LANG: CPROG: hamming */#include<stdio.h>#include<stdlib.h>#include<string.h>int pow2(int num){    int ret = 1;    while (num > 0)    {ret *= 2;num--;    }    return ret;}int GetDistance(int a, int b){    int distance = 0;    a = a^b;    while (a > 0)    {distance += (a&1);a >>= 1;    }    return distance;}int Check(int in, int *arr, int index, int distance){    int ret = 1, i;    for (i=0; i<index; i++)    {if (GetDistance(in, arr[i]) < distance){    ret = 0;    break;}    }    return ret;}int main(void){    FILE *fin, *fout;    int N, B, D;    int *arr;    int i, MAX, index;    fin = fopen("hamming.in", "r");    fout = fopen("hamming.out", "w");    fscanf(fin, "%d %d %d", &N, &B, &D);    arr = (int*)malloc(N*sizeof(int));    memset(arr, 0, N*sizeof(int));    index = 1;    MAX = pow2(B);    for (i=1; i<=MAX; i++)    {if (Check(i, arr, index, D) == 1){    arr[index++] = i;    if (index == N)    {break;    }}    }    for (i=0; i<index-1; i++)    {if (i%10 != 9){    fprintf(fout, "%d ", arr[i]);}else{    fprintf(fout, "%d\n", arr[i]);}    }    fprintf(fout, "%d\n", arr[i]);    return 0;}




















原创粉丝点击