Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Ferrari F1
Заблокирован
#1

Перевод числа из hex в dec - C++

10.07.2016, 15:37. Просмотров 2150. Ответов 40
Метки нет (Все метки)

Привет, можете подсказать как можно перевести 16-ричное число произвольной длины (например, заданное с помощью строки) в десятичную сс? (также можно в строку)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
12.07.2016, 21:47     Перевод числа из hex в dec
  #21

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
void main()
на костёр

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ferrari F1
Заблокирован
12.07.2016, 21:50  [ТС]     Перевод числа из hex в dec #22
IGPIGP, к сожалению, не получилось
'1', '2', 'A', 'C', 'c', 'f' - я так понял представляется число 12ACCF в hex

По идее результат перевода в dec число должен содержать как минимум столько же цифр, сколько их было изначально в hex, а у вас число цифр в числе уменьшилось)
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
12.07.2016, 21:53     Перевод числа из hex в dec #23
Ferrari F1,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string>
#include <stack>
#include <strstream>
 
using namespace std;
 
pair<int, string> divide_by_10(const string& dividend);
 
int main()
{
 
    string hex_str = "ABCDEF1";
    stack<int> digits;
    pair<int, string> residual_quotient;
 
    cout << "Hex string: " << hex_str << endl;
 
    while (hex_str != "0")
    {
        residual_quotient = divide_by_10(hex_str);
        digits.push(residual_quotient.first);
        hex_str = residual_quotient.second;
    }
 
    cout << "Dec string: ";
    while (!digits.empty())
    {
        cout << digits.top();
        digits.pop();
    }
    cout << endl;
    
}
 
pair<int, string> divide_by_10(const string& dividend)
{
    string quotient, tmp;
    int residual = 0,
        dividend_num;
    size_t length = dividend.length();
    strstream converter;
 
    for (size_t i = 0; i < length; ++i)
    {
        converter << dividend[i] << endl;
        converter >> hex >> dividend_num;
 
        dividend_num += residual * 16;
        residual = dividend_num % 10;
 
        converter << hex << (dividend_num / 10) << endl;
        converter >> tmp;
        quotient.append(tmp);
 
    }
 
    if ((quotient[0] == '0') && (quotient.length() > 1))
        quotient.erase(quotient.begin(), ++quotient.begin());
 
    return make_pair(residual, quotient);
}
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6422 / 3061 / 303
Регистрация: 04.12.2011
Сообщений: 8,343
Записей в блоге: 3
12.07.2016, 22:08     Перевод числа из hex в dec #24
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
IGPIGP, к сожалению, не получилось
числа цифр там равны: 4 шт. в 1AFF (6911) и столько же в 2165
но логика кривая, да. Цифры 16-ричные а представляют будто десятичные разряды.

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
на костёр
И так жарко. А войд хоть звучит прохладнее

Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.07.2016, 07:54     Перевод числа из hex в dec #25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
///////////////////////////////////////////////////////////////////////////////
//1.
///////////////////////////////////////////////////////////////////////////////
//как можно перевести 16-ричное число произвольной длины
//(например, заданное с помощью строки) в десятичную сс?
//(также можно в строку)
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_str;
typedef std::vector     < int   >   T_big_num;
///////////////////////////////////////////////////////////////////////////////
void    mult_to_16( T_big_num   &   big_num )
{
    for( auto   &   elem    :   big_num )
    {
        elem    *=  16;
    }
}
///////////////////////////////////////////////////////////////////////////////
void    add_to_bignum
    (
        T_big_num   &   big_num,
        int             num
    )
{
    big_num.front()  +=  num;
}
///////////////////////////////////////////////////////////////////////////////
void    normalize( T_big_num   &   big_num )
{
    int     remainder{};
 
    for( auto   &   elem    :   big_num )
    {
        elem        +=  remainder;
        remainder   =   elem / 10;
        elem        %=  10;
    }//for
 
    if( remainder )
    {
        big_num.push_back( remainder );
    }
 
    if  (
            big_num.back()  >   9
        )
    {
        normalize( big_num );
    }
}
///////////////////////////////////////////////////////////////////////////////
T_str   big_num_to_str( T_big_num   &   big_num )
{
    T_str   res;
 
    std::transform
        (
            big_num.rbegin      (),
            big_num.rend        (),
            std::back_inserter  ( res ),
 
            []  ( auto  num )
            {
                return  '0'     +   num;
            }
        );
 
    return  res;
}
///////////////////////////////////////////////////////////////////////////////
T_str   hex_to_dec( T_str   const   &   hex_str )
{
    T_big_num   big_num_res(1);
 
    for( auto   &   dig_symb    :   hex_str )
    {
        mult_to_16( big_num_res );
 
        auto    dig     =   std::stoi   (
                                            T_str( 1, dig_symb ),
                                            0,
                                            16
                                        );
 
        add_to_bignum
            (
                big_num_res,
                dig
            );
 
        normalize( big_num_res );
    }//for
 
    return  big_num_to_str( big_num_res );
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_str   s   =   "FFAADA5343DADADAE45343FFFAFCEFFAADA5343DADADAE4534"
                    "3FFFAFCEFFAADA5343DADADAE45343FFFAFCE";
 
    std::cout   <<  hex_to_dec(s)
                <<  std::endl;
}
SergioO
13.07.2016, 11:59
  #26

Не по теме:

Mr.X - человек из космоса с мегаформатным кодом
стиль Hypernova

Ferrari F1
Заблокирован
13.07.2016, 14:20  [ТС]     Перевод числа из hex в dec #27
HenryDukart, можете объяснить словесно алгоритм пожалуйста?
Мне бы просто никогда не взбрело в голову использовать стек. Возможно, потому, что ни разу не писал деление...
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
13.07.2016, 14:40     Перевод числа из hex в dec #28
Ferrari F1, алгоритм работает согласно вашему рисунку. Функция divide_by_10 делит число в шестнадцатеричной системе, которое находится в строке, на 10. Возвращает остаток от деления (в десятичной системе в виде int) и частное (в виде строки в шестнадцатеричной системе). Частное на предыдущем шаге используется как делимое на следующем.

Остатки помещаются в стек, потому что их нужно будет извлекать в обратном порядке (опять же смотрите вашу картинку).

Проблема будет, если на вход подать "0". Чтобы убрать эту ошибку необходимо исправить цикл

C++
1
2
while(hex_str != "0")
{ ... }
на

C++
1
2
do
{ ...  } while(hex_str != "0")
Ferrari F1
Заблокирован
13.07.2016, 14:45  [ТС]     Перевод числа из hex в dec #29
HenryDukart, я просто уже 3ий день бился над реализацией этого алгоритма.
В голову ничего не приходит путнего. Не додумался использовать стек и строковые потоки (хоть и в вашем коде используется устаревшая их версия).

Я не знаю как преобрести навык проектирования алгоритма решения задачи.
Может, посоветует кто, как такое умение приобрести?
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
13.07.2016, 14:49     Перевод числа из hex в dec #30
Ferrari F1, книги и практика вам в помощь.
Ferrari F1
Заблокирован
13.07.2016, 14:53  [ТС]     Перевод числа из hex в dec #31
HenryDukart, у меня просто не получается формализовать этот процесс (процесс продумывания алгоритма) на все возникающие передо мной задачи.

По-вашему, есть какие-то общие правила составления алгоритма или это творческий процесс?
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
13.07.2016, 15:13     Перевод числа из hex в dec #32
Ferrari F1,

Не по теме:

Считаю, что изобретение алгоритма требует много знаний, творческого потенциала и, возможно, везения. А вот уже для самого "кодирования" достаточно обладать памятью и опытом.

Ferrari F1
Заблокирован
13.07.2016, 16:42  [ТС]     Перевод числа из hex в dec #33
Нуу, я немного не об этом, конечно... Я вот знаю как на бумажке делить в столбик.
А как научиться переводить этот навык на компьютерный язык?
Вот в подобных случаях и возникают, как правило, трудности...
zer0mail
2323 / 1949 / 192
Регистрация: 03.07.2012
Сообщений: 6,996
Записей в блоге: 1
13.07.2016, 16:49     Перевод числа из hex в dec #34
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Я не знаю как преобрести навык проектирования алгоритма решения задачи.
Надо хоть что-то делать самому. В теме 30+ сообщений, немало кода, но нет ни строчки, написанной ТС. Хочешь бегать - бегай, хочешь поднимать тяжести - поднимай. Можно, конечно, смотреть, как это делают другие, но толку будет мало (если он вообще будет).
Несколько раз в теме писалось: "нужна длинная арифметика". Ее в интернете навалом - и на строках и на массивах и на векторах, но ТС ничего ни искать ни делать самостоятельно (по аналогии со школьным умножением и сложением в столбик) не стал. С таким подходом С++ никогда не осилить
Ferrari F1
Заблокирован
13.07.2016, 16:59  [ТС]     Перевод числа из hex в dec #35
Цитата Сообщение от zer0mail Посмотреть сообщение
нет ни строчки, написанной ТС.
код у меня есть, но недоделанный. Просто иногда бывают моменты когда просто не соображаешь, что надо писать, чтобы было в верном направлении...
А вместо этого получается какая-то лажа в виде багов.
Пишешь например, а потом выясняется, что числа типа F00001 неверно обрабатываются из-за наличия промежуточных нулей.
Или например первая (или любая внутренняя) цифра в числе не делится нацело на десять (она меньше 10), тогда нужно запоминать эту цифру и к след. разряду ее приписывать (1F01).
Слишком много случаев получается, и в голове их все, бывает, не можешь удержать. Как следствие - баги...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
unsigned f_fromHex(const char& digit)
{
    switch (digit)
    {
    case 'A':
        return 10;
        break;
    case 'B':
        return 11;
        break;
    case 'C':
        return 12;
        break;
    case 'D':
        return 13;
        break;
    case 'E':
        return 14;
        break;
    case 'F':
        return 15;
        break;
    default:
        return digit - '0';
        break;
    }
}
 
unsigned f_convert(const string& str);
 
void f_strDevide(string& number, string& result)
{
    string forReturn;
    
    auto temp(0u);
    for (auto head(number.cbegin()), cur(head), end(number.cend() - 1);
        head != end; ++head)
    {
        temp = f_convert(string(cur, head + 1));
 
        if (temp / 10)
        {
            forReturn += to_string(temp / 10);
            cur = head;
            temp = 0;
        }
        else if (!forReturn.empty())
        {
            forReturn.push_back('0');
        }
    }
}
 
string f_toDec(string hex)
{
    string result;
 
    while (hex.size() > 1)
        f_strDevide(hex, result);
 
    auto digit(f_fromHex(*hex.begin()));
    result += to_string(digit % 10);
 
    if (digit /= 10)
        result += to_string(digit);
 
    reverse(hex.begin(), hex.end());
    return result;
}
 
int main()
{
    string number("1FFFF");
    system("pause");
}
zer0mail
2323 / 1949 / 192
Регистрация: 03.07.2012
Сообщений: 6,996
Записей в блоге: 1
13.07.2016, 17:05     Перевод числа из hex в dec #36
Если код есть, то его надо писать в первом сообщении, а не в 35м. Причем писать с комментариями, зачем, что и как делаешь. Вместе со словесным описанием алгоритма, который реализует этот код. Тогда будет видно, где и какие ошибки и времени (нашего и вашего) будет потрачено меньше, а толку будет больше.
Вот, как-то так
Ferrari F1
Заблокирован
13.07.2016, 17:15  [ТС]     Перевод числа из hex в dec #37
И я ума не приложу, как так в голове продумать алгоритм, чтобы он был обобщенным, а не охватывал лишь частные случаи..
Это я говорю не только о делении, а вообще обо всех возникающих задачах...

Добавлено через 3 минуты
Перед тем, как писать это деление, я никакой архитектуры программы не продумывал.
Просто сел и так навскидку попытался сделать... Без псевдокода, диаграмм и тп, как пишут об этом в книгах.
И как результат, тут некоторые накидали код за час-два, а я за третий день не могу нормально ничего набросать.

Да как вобще бороться с этой проблемой?
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
13.07.2016, 17:24     Перевод числа из hex в dec #38
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Да как вобще бороться с этой проблемой?
Практикой. Если сдаваться, то не справитесь
И отчаиваться не надо, если не получается
Всё равно рано или поздно одолеете.
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.07.2016, 17:46     Перевод числа из hex в dec #39
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Да как вобще бороться с этой проблемой?
Мне кажется, в таких случаях надо несколько снизить сложность решаемых задач. Натренироваться и почувствовать себя уверенно на простых, а потом постепенно усложнять. Ну и потом рассматриваемая задача не столько на программирование, сколько математическая, про позиционные системы счисления не вредно было бы в процессе решения почитать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2016, 15:10     Перевод числа из hex в dec
Еще ссылки по теме:
Перевод string в hex C++
C++ Перевод hex в char
Перевод данных в hex. C++
C++ Перевод из HEX в ASCII и ещё кое - что
C++ Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zer0mail
2323 / 1949 / 192
Регистрация: 03.07.2012
Сообщений: 6,996
Записей в блоге: 1
14.07.2016, 15:10     Перевод числа из hex в dec #40
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
И я ума не приложу, как так в голове продумать алгоритм, чтобы он был обобщенным, а не охватывал лишь частные случаи.
Для начала надо придумать и реализовать алгоритм, который решает конкретную поставленную задачу: для этой надо час-два максимум. А не сидеть 3 дня в раздумьях "как бы решить задачу в общем". Если в процессе решения возникнет возможность обобщения, причем за счет небольших усилий, то пожалуйста. Иначе будет так: время потрачено, а результата нет.
От программиста нужен результат, а не медитации и объяснения типа "хотел обобщить, сделать лучше, эффективнее, но не получилось". Все обобщения и улучшения - после (если они окажутся действительно необходимыми). Что на самом деле лучше выясняется в процессе реализации, а не в процессе многодневного "нечегонеделания".
Yandex
Объявления
14.07.2016, 15:10     Перевод числа из hex в dec
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru