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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.