1. 程式人生 > >格雷碼生成(分治法)

格雷碼生成(分治法)

lose def rev can i++ stdlib.h 輸入一個數 txt urn

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<stdlib.h>
 4 #define SIZE_OF_NUM 1025  //格雷碼總數 
 5 #define SIZE_OF_BIT 11   //格雷碼的二進制位數 
 6 void get_Gray_code(int a[SIZE_OF_NUM][SIZE_OF_BIT],int mid,int n,int b,int reverse_or_not);
 7 int main()
 8 {
 9     FILE *fp=NULL;
10 fp=fopen("input.txt","r"); 11 if(fp==NULL) 12 { 13 printf("Failed to open file!\n"); 14 exit(0); 15 } 16 int GrayCode[SIZE_OF_NUM][SIZE_OF_BIT]; 17 int b,n; 18 printf("input b: "); 19 // scanf("%d",&b); 20 fscanf(fp,"%d",&b); 21 fprintf(stdout,"
%d\n",b); 22 fclose(fp); 23 fp=fopen("output.txt","w"); 24 if(fp==NULL) 25 { 26 printf("Failed to open file!\n"); 27 exit(0); 28 } 29 n=pow(2,b); 30 get_Gray_code(GrayCode,n/2,n,1,0); 31 for(int i=1;i<=n;i++) 32 { 33 for(int j=1;j<=b;j++)
34 { 35 // printf("%d\t",GrayCode[i][j]); 36 fprintf(fp,"%d\t",GrayCode[i][j]); 37 fprintf(stdout,"%d\t",GrayCode[i][j]); 38 } 39 // printf("\n"); 40 fprintf(fp,"\n"); 41 fprintf(stdout,"\n"); 42 } 43 fclose(fp); 44 return 0; 45 } 46 47 void get_Gray_code(int a[SIZE_OF_NUM][SIZE_OF_BIT],int mid,int n,int b,int reverse_or_not) 48 //SIZE_OF_NUM格雷碼個數 SIZE_OF_BIT 格雷碼位數 49 //mid 中間點序號 n 本次操作格雷碼個數 b格雷碼位數 reverse_or_not 為0則下一位為01 ,為1則下一位為10 50 { 51 if(n==1) 52 return; 53 else 54 { 55 for(int i=mid-n/2+1;i<=mid;i++) 56 { 57 a[i][b]=reverse_or_not; 58 } 59 for(int j=mid+1;j<mid+n/2+1;j++) 60 { 61 a[j][b]=1-reverse_or_not; 62 } 63 // if(n>=1) 64 { 65 get_Gray_code(a,mid-n/4,n/2,b+1,0); 66 get_Gray_code(a,mid+n/4,n/2,b+1,1); 67 } 68 } 69 }

題目要求:

從文件中輸入一個數字,輸出對應位數的格雷碼,例如:

//input.txt
3
//output.txt
0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

格雷碼生成(分治法)