C/C++

Помогите пожалуйста с кодом на с++

Напишите программу, которая запрашивает число в двоичной системе счисления и выводит его шестнадцатеричную запись. Длина двоичного числа кратна четырём. Каждой шестнадцатеричной цифре соответствуют четыре двоичных цифры:
0 0000 8 1000
1 0001 9 1001
2 0010 A 1010
3 0011 B 1011
4 0100 C 1100
5 0101 D 1101
6 0110 E 1110
7 0111 F 1111
Sample Input 1:
10001111
Sample Output 1:
8F
Sample Input 2:
10010001000100001111100010001000
Sample Output 2:
9110F888
Sample Input 3:
1001101100101001000110011000000000001111
Sample Output 3:
9B2919800F

мой код не проходит(( что не так
#include <iostream>
using namespace std;
int main() {
string s; cin >> s;
for (int i=10001111; i<s.length(); i++){
if (s[i] =='0000'){ cout<< "0";}
else if(s[i]=='0001'){cout<< "1";}
else if(s[i]=='0100'){cout<< "2";}
else if(s[i]=='0011'){cout<< "3";}
else if(s[i]=='0100'){cout<< "4";}
else if(s[i]=='0101'){cout<< "5";}
else if(s[i]=='0110'){cout<< "6";}
else if(s[i]=='0111'){cout<< "7";}
else if(s[i]=='1000'){cout<<"8";}
else if(s[i]=='1001'){cout<< "9";}
else if(s[i]=='1010'){cout<< "A";}
else if(s[i]=='1011'){cout<< "B";}
else if(s[i]=='1100'){cout<< "C";}
else if(s[i]=='1101'){cout<< "D";}
else if(s[i]=='1110'){cout<< "E";}
else if(s[i]=='1111'){cout<< "F";}
}
return 0;
}
В чем трудность? В общем виде решается двумя встроенными функциями
строка в число с указанием системы
https://en.cppreference.com/w/cpp/string/basic_string/stol
и выводом с манипулятором hex. вывод можно сделать и в строку.
https://en.cppreference.com/w/cpp/io/manip/hex

Не работает т. к. цикл построен неправильно. Почему i=10001111? Почему i сравнивается с длиной строки? Вам можно было использовать функцию substr, чтобы получать подстроки по 4 символа.
https://en.cppreference.com/w/cpp/string/basic_string/substr

Если делать циклом, то щаг не должен быть = 1, а 4. И лучше использовать массив вместо if-else

Готовое решение принципиально не даю. Не потому, что вредный - а потому, что лучше самому. Подумайте. Будут вопросы - пишите.

ЗЫЖ: else if(s[i]=='0100') { cout<< "2"; } - ошибка. Двойка это 0010
Эля _!!!
Эля _!!!
84 764
Лучший ответ
#include <iostream>
#include <string>
using namespace std;
string base_to_base(const string& x, int base, int conv = 10) {
const string n = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
long long s;
if (base == 10) s = stoi(x);
else {
s = 0;
auto i = static_cast<long long>(x.length()) - 1;
int p = 0;
while (i >= 0) {
auto m = static_cast<long long>(n.find(x[i]));
auto k = static_cast<long long>(pow(base, p));
s += m * k;
++p;
--i;
}
}
if (conv != 10) {
string box;
while (s) {
box.push_back(n[s % conv]);
s /= conv;
}
return string(box.rbegin(), box.rend());
}
return to_string(s);
}
string bin_to_hex(string& bin) {
return base_to_base(bin, 2, 16);
}
int main() {
string bin;
cin >> bin;
cout << bin_to_hex(bin) << '\n';
system("pause > nul");
}
https://ideone.com/TqznG6

#include < iostream >
#include < stack >
using namespace std;

int main() {
string s("10010001000100001111100010001000");
//cin>>s;
stack < char > data;
stack < char > hexed;
data.push('0');data.push('0');data.push('0');
for(char a:s)data.push(a);
while(data.size() > 3){
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0': // 0000
data.pop();
hexed.push('0');
break;
case '1': // 1000
data.pop();
hexed.push('8');
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0': // 0100
data.pop();
hexed.push('4');
break;
case '1': // 1100
data.pop();
hexed.push('C');
break;
}
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0': // 0010
data.pop();
hexed.push('2');
break;
case '1': // 1010
data.pop();
hexed.push('A');
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0': // 0110
data.pop();
hexed.push('6');
break;
case '1': // 1110
data.pop();
hexed.push('E');
break;
}
break;
}
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0': // 0001
data.pop();
hexed.push('1');
break;
case '1': // 1001
data.pop();
hexed.push('9');
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0': // 0101
data.pop();
hexed.push('5');
break;
case '1': // 1101
data.pop();
hexed.push('D');
break;
}
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0':
data.pop();
switch(data.top()){
case '0': // 0011
data.pop();
hexed.push('3');
break;
case '1': // 1011
data.pop();
hexed.push('B');
break;
}
break;
case '1':
data.pop();
switch(data.top()){
case '0': // 0111
data.pop();
hexed.push('7');
break;
case '1': // 1111
data.pop();
hexed.push('F');
break;
}
break;
}
break;
}
break;
}
}
while(hexed.size()){ cout<<hexed.top();hexed.pop(); }

return 0;
}
#include
#include
#include

using namespace std;

int main()
{
string s;
cin >> s;
int len = s.length();
if(len % 4 == 0)
{
int i = 0;
for(int x = 0; x < len/4; x++)
{
string tmp;
for(int y = 0; y < 4; y++)
{
tmp += s[i];
i++;
}
if(tmp == "0000") cout << '0';
else if(tmp=="0001") cout<< '1';
else if(tmp=="0010") cout<< '2';
else if(tmp=="0011") cout<< '3';
else if(tmp=="0100") cout<< '4';
else if(tmp=="0101") cout<< '5';
else if(tmp=="0110") cout<< '6';
else if(tmp=="0111") cout<< '7';
else if(tmp=="1000") cout<< '8';
else if(tmp=="1001") cout<< '9';
else if(tmp=="1010") cout<< 'A';
else if(tmp=="1011") cout<< 'B';
else if(tmp=="1100") cout<< 'C';
else if(tmp=="1101") cout<< 'D';
else if(tmp=="1110") cout<< 'E';
else if(tmp=="1111") cout<< 'F';
}
cout << endl;
}
else
{
cerr << "Количество цифр должно быть крано четырём." << endl;
return 1;
}

return 0;
}
Алексей Поляков Третий вывод отличается.
У меня вышло: 9B919800F