这道题就是将某一数字的二进制表示形式和已有数字的二进制进行比较,如果该数字与所有原有数字的二进制的不同位数达到要求,那么该数字符合要求。我们可以采用将该数字与原有数字进行异或运算,将异或后的数字转换为二进制,清点该数字二进制中“1”的个数,即为不同的个数。当然,也可以把当前数字转换成二进制,将原有数字也都转换成二进制进行比较。代码如下。
#include<bits/stdc++.h>
using namespace std;
int b[10],c[256];
int B=0,D=0;
void change(int x){
int i=1;
while (x!=0){
b[i++]=(x%2);
x/=2;
}
}
int main (){
freopen ("hamming.in","r",stdin);
freopen ("hamming.out","w",stdout);
int N=0,i=0,j=0,k=0,MAX=1,cnt=1,count=0;
bool flag=true;
cin>>N>>B>>D;
for (i=1;i<=B;i++){
MAX*=2;
}
c[cnt]=0;
for (i=1;i<MAX;i++){
if (cnt>=N){
break;
}
flag=true;
for (j=1;j<=cnt;j++){
memset(b,0,sizeof(b));
change(i^c[j]);
count=0;
for (k=1;k<=B;k++){
if (b[k]==1){
count++;
}
}
if (count<D){
flag=false;
break;
}
}
if (flag){
cnt++;
c[cnt]=i;
flag=false;
}
}
count=1;
cout<<c[1]<<" ";
for (i=2;i<=cnt;i++){
cout<<c[i];
count++;
if (count==10||i==cnt){
cout<<endl;
}
else {
cout<<" ";
}
if (count==10){
count=0;
}
}
return 0;
}