Професионална програма
Loading...
+ Нов въпрос
LoshaPanda avatar LoshaPanda 10 Точки

C++ Fundamentals Roxettes - solution ( проблем )

Извинете, имам проблем с решението на тази задача : https://imagebin.ca/v/5JAoGDPIzYUJ.Това е кода за решението :

#include<iostream>
#include<iomanip>

using namespace std;

int hexSymbolToDecimal(char hex) {
    if (hex >= 'a') {
        return 10 + (hex - 'a');
    }
    else {
        return hex - '0';
    }
}

int main() {
    cin.sync_with_stdio(false);
    cout.sync_with_stdio(false);

    const unsigned int NumHexDigitsPerNumber = 5;

    char input[NumHexDigitsPerNumber] = {};

    size_t xorred = 0;

    while (cin >> input[0]) {
        if (input[0] == '.') {
            break;
        }

        cin >> input[1] >> input[2] >> input[3] >> input[4];

        int value = 0;
        for (int i = 0; i < NumHexDigitsPerNumber; i++) {
            value = value << 4; // this is equivalent to value *= 16;, but works faster than multiplication
            value += hexSymbolToDecimal(input[i]);
        }

        xorred ^= value;
    }

    cout << hex << setfill('0') << setw(5) << xorred << endl;
}

Пробмелът е в " for " цикъла при " value = value << 4 " . Разбрах как работи, но не разбрах защо трябва да го правим ? От това което видях е, че премества 4 бита наляво, като от дясната страна поставя нули. Въпросът ми е защо трябва да го правим и как работи това " hex " накрая с " setfill('0') и setw(5) ? Надявам се, че някой може да ми помогне да го разбера !

 

Тагове:
0
C++ Fundamentals
takvor avatar takvor 45 Точки
Best Answer

По този начин освобождаваш място за "единиците". Това е същото като към десетично "1" да конкатенираш друга цифра, напр. "5" и да получиш "15". Числено го правиш така: 1*10 + 5 = 15. Добавяш цифрови разреди в числото, като го изместваш наляво, умножавайки го със "системната кратност".

1
LoshaPanda avatar LoshaPanda 10 Точки

Извинете, но все още не разбирам. Можете ли да го обясните по-подробно моля ?

0
takvor avatar takvor 45 Точки

Четири binary shift-a са един hexadecimal (1111 (binary)  = f (hex) = 15 (dec)) не забравяме, че броим "zero included". Независимо от бройната система, числата в паметта са в двоична (0 or 1) и затова shift-ваме броя битове, отговарящ на един разряд (кратността на бройната система) от числото. Това е същото ако го представим в десетична, умножим го по 16 и го върнем в шестнадесетична.

0
LoshaPanda avatar LoshaPanda 10 Точки

Аз като цяло не мога да разбера логиката на програмата .. Нямам почтин никакви знания по кампютърни науки. Благодаря все пак ! Ще попитам лектора !

0
miroslav_krajcir avatar miroslav_krajcir 1 Точки

Hallo, there is also another way to solve this problem than bit operations... you can store the roxette in unordered_set and when it pairs you erase it, so in the end only the one roxette without pair remains...


#include <iostream>
#include <string>
#include <unordered_set>

int main() {
	std::cin.sync_with_stdio(false);
	std::cout.sync_with_stdio(false);

	std::string			roxette = "00000";
	std::unordered_set<std::string>	roxettes;

	while (true) {
		//	read the first digit
		std::cin >> roxette[0];
		if (roxette[0] == '.')
			break;

		//	read the rest of the digits...
		std::cin >> roxette[1] >> roxette[2] >> roxette[3] >> roxette[4];

		auto it = roxettes.find(roxette);

		//	if roxette is not found in set, include the roxette
		if (it == roxettes.end())
			roxettes.insert(roxette);
		//	if already included, erase the roxette
		else
			roxettes.erase(roxette);
	}

	//	print the result
	for (auto& r : roxettes)
		std::cout << r;
}

Roxettes - Pastebin.com

0