华科的题很有深度啊,没有一点基础知识的话估计这个都是做不出来的吧。。
首先说一下什么是奇偶校验:
它是一种校验代码传输正确性的方法。
按照被传输的一组二进制代码数位中“1”的个数为奇数或者偶数来进行校验。
CPU读取存储的数据时,会把前八位存储的数据相加,看计算结果是否与校验位一致。一般校验位为最高位。
题目描述:对输入的一组字符串每一个字符进奇校验,最高位为校验位。输出结果并换行。
解题思路:
本质可以理解为一个简单的字符串处理问题,对于每一个字符串逐位处理字符。对于输入的字母视为ascii码,(最大127)所以只要str[1...7]保存原有数据即可
通过膜二的方式计算出二进制形式,最高位保留校验位,通过计算str[1..7]中1的个数修改str[0]中存放的数字,使得最后str[0..7]中存储的1的个数为奇数。
1 #include<stdio.h> 2 #include<string.h> 3 #define N 200 4 void print(char c) 5 { 6 int str[8];//str[0]为校验位 7 int i=7; 8 int count=0; 9 while(c>0) 10 { 11 str[i]=c%2; 12 c=c/2; 13 i--;//倒着存,因为输出的时候高位在后面 14 } 15 while(i>=1) 16 { 17 str[i]=0; 18 i--; 19 } 20 for(i=1; i<8; i++) 21 { 22 if(str[i]==1)count++;//统计1的位数 23 } 24 if(count%2==0)str[0]=1;//若1的个数为偶数,最高位置1,否则置0 25 else str[0]=0; 26 for(i=0; i<8; i++)printf("%d",str[i]); 27 printf("\n"); 28 } 29 int main() 30 { 31 char str0[100]; 32 int len,i; 33 while(gets(str0)) 34 { 35 len=strlen(str0); 36 for(i=0; i<len; i++) 37 print(str0[i]); 38 } 39 return 0; 40 }