Hamming Codes

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


解题思路

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

代码

/*
ID: zc.rene1
LANG: C
PROG: 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;
}




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值