2013年10月1日 星期二

[C/C++ 演算法]- 格雷碼(Gray Code)

[C/C++ 演算法]- 格雷碼(Gray Code)



剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。


拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/GrayCode.htm









#include <stdio.h> 
#include <stdlib.h>

void
doGray(int, void (*)(int*, int));
void
init(int*, int);
int
firstOneOf(int*, int);
void
next(int*, int, int);
int
isLast(int*, int);
void
print(int*, int);

int
main(void) {
int
length;
printf("輸入位元數:");
scanf("%d", &length);

doGray(length, print);

return
0;
}


void
doGray(int length, void (*take)(int*, int)) {
int
* gray = malloc(length * sizeof(int));
init(gray, length);
take(gray, length);
int
isOdd = 1;
while
(!isLast(gray, length)) {
next(gray, length, isOdd);
isOdd = 1 - isOdd;
take(gray, length);
}

free(gray);
}


void
init(int* gray, int length) {
int
i;
for
(i = 0; i < length; i++) { gray[i] = 0; }
}


int
firstOneOf(int* gray, int length) {
int
j;
for
(j = 0; gray[j] == 0; j++);
return
j;
}


void
next(int* gray, int length, int isOdd) {
int
i = isOdd ? 0 : firstOneOf(gray, length) + 1;
gray[i] = !gray[i];
}


int
isLast(int* gray, int length) {
int
i;
for
(i = 0; i < length - 1; i++) if(gray[i]) { return 0; }
return
gray[i];
}


void
print(int* gray, int length) {
int
j;
for
(j = length - 1; j >= 0; j--) { printf("%d", gray[j]); }
printf("\n");
}


 


 


沒有留言:

張貼留言