LeetCode | GrayCode

题目:产生格雷码

思路:先转成二进制,再逐位与前一位异或,最高位不用变

代码:以三位格雷码为例

(练习一下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");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值