首页 > 代码库 > 题目1197:奇偶校验

题目1197:奇偶校验

题目描述:

输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如‘3’,输出:10110011)。

输入:

输入包括一个字符串,字符串长度不超过100。

输出:

可能有多组测试数据,对于每组数据,
对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。

样例输入:
3
3a
样例输出:
10110011
10110011
01100001
解题思路
        刚开始奇偶校验不知道是什么意思,下面简单说一下。
        信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。
比如说对字符‘3’进行奇偶校验。‘3‘的ascii值为51,51对应二进制为  0110011(用七位表示)  其中1的个数为4(偶数)个。所以在最高为添1 所以‘3‘的奇校验为10110011
另外注意一下十进制转二进制 循环的写法      有些博客上是用位操作 &来做的   比如 http://blog.csdn.net/wconvey/article/details/8510943
刚开始总是WA  找了很久发现  原来是数组开小了 我开的100  这样的话会溢出   所以直接报错   改成105就好了
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int judge[9];
int sum;
void toBinary(char c){//字符c ascii值 十进制转 二进制函数
	sum=0;
	int x;
	for(int i=0;i<8;i++) judge[i]=0;
	x=c;
//	cout<<x<<endl;
	int i=7;
	int newx;
	do{
		newx=x/2;
		int t=x%2;
		judge[i--]=t;
		if(t==1) sum++;
		x=newx;
	}while(newx!=0);
	
}
int main(){

	char a[105];
	while(cin.getline(a,105)){
		for(int i=0;i<strlen(a);i++){
			char ch=a[i];
			if(ch==‘\0‘) break;
			//ch是当前字符
			toBinary(ch);
		//	cout<<"sum="<<sum<<endl;
			if(sum%2==1) judge[0]=0;
			else judge[0]=1;
			for(int i=0;i<8;i++) printf("%d",judge[i]);
			printf("\n");
		}
	}
} 

  

 

题目1197:奇偶校验