题目:产生格雷码
思路:先转成二进制,再逐位与前一位异或,最高位不用变
代码:以三位格雷码为例
(练习一下struct的使用,用数组存各个struct的指针,每个格雷码使用一个struct)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int bnry[10]={0};
char* change(char*);
// num of bits, current bit, name of int array
int* toBinary(int, int, int*);
int* toGray(int,int, int*);
// name of int array, num of bits
void printIntArray(int*,int);
struct earlGray {
int ch[100];
};
int main(int argc, const char * argv[]) {
// insert code here...
//char ch[]="sf adfaf dffd";
//printf("%s\n",ch);
int numOfBits=3;
int i=0;
int totalNum=8;
struct earlGray* p[8];
while(i<totalNum){
p[i]=(struct earlGray*)malloc(sizeof(struct earlGray));
toBinary(numOfBits,i,p[i]->ch);
// printIntArray(p[i]->ch, numOfBits);
toGray(numOfBits,i,p[i]->ch);
printIntArray(p[i]->ch, numOfBits);
i++;
}
system("pause");
return 0;
}
char* change(char* ch){
ch[0]='0';
ch[1]='1';
return ch;
}
//No need to return, since it revise ch dierectly, not the copy.
int* toBinary(int n,int current, int* ch ){
//to binary
int j,l;
j=l=0;
do {
if(current>=0){
j=current%2;
current=current/2;
ch[n-1]=j;
}else
if (current==0) {
ch[n-1]=0;
}
n--;
} while (n!=0);
return ch;
}
int* toGray(int n,int current, int* ch ){
while(n>1){
if (ch[n-1]==ch[n-2]) {
ch[n-1]=0;
}else
{
ch[n-1]=1;
}
n--;
}
return ch;
}
void printIntArray(int* ch,int n){
int k=0;
while(k<n){
printf("%d",ch[k]);
k++;
}
printf("\n");
}