牛客 KY213 奇偶校验 题解(C++版)

157 阅读1分钟

奇偶校验_牛客网 (nowcoder.com)

描述

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

输入描述:

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

输出描述:

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

示例

输入

3
3a

输出

10110011
10110011
01100001

题解 1

思路

奇校验的要求是二进制串中要有奇数个 1 ,对于本题,首先将输入的字符化为对应的二进制串,然后统计其中的 1 的个数,根据统计结果决定是否将二进制串的最高位置 1 。

程序

#include <bits/stdc++.h>
#define MAX 10
using namespace std;
int res[MAX];
 
int d2b(int n) {
    int i = 0;
    memset(res, 0, sizeof(res));
    while (n) {
        res[i] = n % 2;
        i++;
        n /= 2;
    }
    int sum = 0;
    for (int j = 0; j < 8; j++)
        if (res[j] == 1)
            sum++;
    if (sum % 2 == 0)
        return 1;
    else
        return 0;
}
 
int main() {
    string s;
    while (cin >> s) {
        for (int i = 0; i < s.size(); i++) {
            if (d2b((int)s[i]))
                res[7] = 1;
            for (int i = 7; i >= 0; i--)
                cout << res[i];
            cout << endl;
        }
    }
    return 0;
}

题解 2

思路

利用 C++ 提供的 bitset 库进行解题。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    char s;
    while (cin >> s) {
        // 使用 bitset 类型,将字符 s 转换为 8 位的二进制表示。
        bitset<8> bs(s);
        // 计算二进制表示中 "1" 的个数。
        auto c = bs.count();
        // 如果 "1" 的个数为奇数,则在最高位添加一个 "1",否则添加 "0"。
        bs[7] = (c % 2 != 1);
        cout << bs << endl;
    }
    return 0;
}