奇偶校验

华科的题很有深度啊,没有一点基础知识的话估计这个都是做不出来的吧。。

首先说一下什么是奇偶校验:

它是一种校验代码传输正确性的方法。

按照被传输的一组二进制代码数位中“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 }

 

posted @ 2018-02-05 21:39  -DP-  阅读(666)  评论(0编辑  收藏  举报