Pesquisar este blog

Livros Recomendados

sexta-feira, 5 de março de 2021

URI (BEECROWD) - 2176 - Paridade - Iniciante - C e C++

Solução do problema "Paridade" abaixo.

Plataforma: URI (BEECROWD)

Problema2176

Enunciado:

A popularização das redes WiFi aumentou a taxa de perda de informações sendo transferidas, uma vez que diversos fatores do meio ambiente podem facilmente comprometer os dados durante o tráfego. A URI, Unidade de Recuperação de Informações, tem como principal objetivo identificar e corrigir erros em mensagens enviadas via redes WiFi.

A técnica utilizada pela URI para identificação de erros é o teste de paridade, o qual pode ser descrito da seguinte forma: Seja S uma mensagem que será enviada de um dispositivo para outro. Antes de S ser enviada, um bit extra B é adicionado no final da representação binária de S. Se a mensagem S tiver um número par de bits de valor 1, o bit extra B terá valor 0. Caso contrário, se S tiver um número ímpar de bits de valor 1, B terá valor 1. Desta forma, após a inserção do bit B, a mensagem S terá um número par de bits de valor 1.

Quando o destinatário recebe a mensagem S ele faz a contagem de bits de valor 1. Se a quantidade for par, significa que a mensagem chegou com sucesso. Caso contrário, significa que a mensagem sofreu uma alteração e não está correta.

Sua tarefa é escrever um algoritmo que faça a inserção do bit B na mensagem S, de forma que após a inserção a mensagem S tenha um número par de bits de valor 1.

Linguagens: C e C++


Solução:

Código em C:

Aqui em C eu resolvi usando um ponteiro de char com alocação de espaço para 120 caracteres e leio a sequência com gets. O while na sequência varre a string até chegar ao seu final (representado pelo caractere terminador '\0'). Quando encontra o valor 1, incrementa a variável bit.

Utilizei bitwise para verificar se a quantidade de bits 1 era ímpar, com o teste "bit & 1".

#include <stdio.h>
int main() {
    char *s = (char *) malloc(sizeof(char) * 120);
    int bit = 0, i = 0;
    gets(s);
    while (s[i] != '\0') {
        if (s[i] == '1') {
            bit++;
        }
        i++;
    }
    if (bit & 1)
        printf("%s1\n", s);
    else
        printf("%s0\n", s);
    return 0;
}

Código em C++:

Aqui também utilizei bitwise. A solução é um pouco mais simples para o programador por não precisar se preocupar em alocar memória, basta usar o tipo string.

#include <iostream>
using namespace std;
int main() {
    string s;
    int bit = 0, i = 0;
    getline(cin, s);
    while (s[i] != '\0') {
        if (s[i] == '1') {
            bit++;
        }
        i++;
    }
    cout << s;
    if (bit & 1)
        cout << "1";
    else    
        cout << "0";
    cout << endl;
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas