九度-1197

题目链接:http://ac.jobdu.com/problem.php?pid=1197


在这个题目中,题目不难,但是一开始看不懂题目,描叙好像不大全,,后来才知道题意就是对一个ASCII码字符进行奇校验编码,由于一个ASCII码是7位编码的,所以第8位可以为检验位。。然后就是把一个字符的值转换成2进制,统计里面“1”出现的个数,若为偶数,则在最高位填“1”,否则填“0”。

有了这个题意后,后面的代码就不难了,我的二进制转换,用的是stl中的栈来实现的。有个注意的地方就是,它并不能保证栈中一定是7位数据,所以我后面填充了0,一直到7位,使得最后的输出为8位!AC代码如下:


#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 55555;

void solve(char c)
{
	stack<int>S;
	//统计1的个数,用奇校验放在最高位
	//其它的7位数,将这个字符的ascii码转换后,写入,一个字符是1由7位ascii码组成
	int i, j, va, one = 0, high;
	va = c;
	while (va)
	{
		S.push(va % 2);
		if (va % 2 == 1)
			one++;
		va /= 2;
	}
	while (S.size() != 7)         //在这里一定要保证个数是7个  
		S.push(0);
	if (one % 2 == 1)             //如果1的个数是奇数个,那么最高位为0
		high = 0;
	else
		high = 1;                 //如果1的个数是偶数个,那么最高位为1
							      //下面进行输出
	printf("%d", high);
	while (!S.empty())
	{
		printf("%d", S.top());
		S.pop();
	}
}
int main(void)
{
	//freopen("in.txt", "r", stdin);
	string s;

	while (cin >> s)
	{
		int i, j;
		for (i = 0; i<s.length(); i++)               //对每个字符进行处理
		{
			solve(s[i]);
			printf("\n");                            //每一个处理后,得有一个换行
		}
	}
	return 0;
}


你可能感兴趣的:(九度-1197)