思路来自:https://blog.csdn.net/wcr1996/article/details/43834545
先解释一下题意:
①输入:先输入d(disk的数量) s(每块数据块有s个bit) b(每块disk上的数据块和校验块的数目),再输入d行数据。
②奇偶校验:E偶校验 :1的个数为偶:0
· 奇:1
O奇校验: 1个数为偶:0
1的个数为奇:1
③disk表:
此图就是校验位和数据存放的位置,但是输入是每条每条的disk(表中竖着的)。
思路如下:
1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 int d,s,b,n; 5 char disk[7][6500]; 6 int op; 7 int read()//读入函数 8 { 9 scanf("%d%d%d\n",&d,&s,&b); 10 if(d==0) 11 return 0; 12 memset(disk,0,sizeof(disk)); 13 char ch=getchar(); 14 if(ch=='O') 15 op=1; 16 else 17 op=-1; 18 n=s*b; 19 for(int i=0;i<d;i++) 20 scanf("%s",disk[i]); 21 return 1; 22 } 23 int solve() 24 { 25 for(int i=0;i<n;i++)//n=s*b,为一个disk中的所有数据 26 { 27 int k=-1; 28 int broke=-1; 29 for(int j=0;j<d;j++) 30 { 31 char c=disk[j][i]; 32 if(c=='1') 33 k=-k; 34 if(c=='x')//记下位置 35 { 36 if(broke!=-1) 37 return 0; 38 else 39 broke=j; 40 } 41 } 42 if(broke==-1&&k!=op) return 0;//校验不合法 43 if(broke!=-1) 44 disk[broke][i]=k==op?'0':'1';//修复 45 //偶校验:op=-1,k==-1(偶数个1)补0;k=1(偶数个),补1。 46 //奇校验:op=1,k==1(奇数个1) 补0;k=-1(偶数个),补1. 47 } 48 return 1; 49 } 50 void print(int v) 51 { 52 if(v==0) 53 { 54 printf("invalid.\n"); 55 return; 56 } 57 printf("valid, contents are: "); 58 int num=0,cnt=0; 59 for(int i=0;i<b;i++) 60 { 61 int pos=i*s; 62 for(int j=0;j<d;j++) 63 { 64 if(i%d==j) 65 continue; 66 for(int k=0;k<s;k++) 67 { 68 num<<=1; 69 num+=disk[j][pos+k]=='1'; 70 cnt++; 71 if((cnt%=4)==0) 72 printf("%X",num),num=0; 73 } 74 } 75 } 76 if(cnt) 77 printf("%X",num<<(4-cnt));//补0 78 printf("\n"); 79 return; 80 } 81 int main() 82 { 83 int t=0; 84 while(read()!=0) 85 { 86 printf("Disk set %d is ",++t); 87 print(solve()); 88 } 89 return 0; 90 }