Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
#1

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

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

Привет, можете подсказать как можно перевести 16-ричное число произвольной длины (например, заданное с помощью строки) в десятичную сс? (также можно в строку)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2016, 15:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перевод числа из hex в dec (C++):

Перевод чисел Bin - Oct - Dec - Hex - C++
Существуют ли функции для перевода числа (или строки из цифр) из одной системы счисления (по основанию 2, 8, 10, 16) в другую. Как из...

[BMP] HEX (из HEX-редактора) в DEC - C++
Имеется файл *.bmp (который нельзя вложить в сообщение). В самом файле есть его свойства (размер и т.д.). Как их перевести из HEX в DEC? ...

Из Hex в Dec - C++
Перевел из чара в инт и что-то не вьеду как теперь возвести . #include<iostream> #include<cmath> #include<string> using...

S dec na hex, ukazatel - C++
Pomogite pojaluista! Etot kod menyaet 10noe chislo na 16noe. Nado izmenit eto chtoby zdes byl ukazatel i funkcia to est v int main() Tolko...

Как в С++ конвертнуть HEX в DEC? - C++
Киберперцы, есть ли готовая функция в Visual C++ для конвертации из HEX (типа F4A36) в DEC (типа 1002038) ?

Манипуляторы dec hex setfill setw - C++
что такое операторы dec hex setfill sew м как они работают?

40
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
12.07.2016, 19:56  [ТС] #16
нужно только реализовать алгоритм деления в столбик на 10
0
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
12.07.2016, 20:19 #17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
нужно только реализовать алгоритм деления в столбик на 10
Если длинное число состоит из блоков, кратных степени 10, то делить не надо. Надо реализовывать сложение с целым и умножение на целое.
0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
12.07.2016, 20:29  [ТС] #18
zer0mail, я не совсем понял, что вы имеете в виду. Как применить ваше правило к такому числу?
C++
1
std::string hexNumber = "FFAADA5343DADADAE45343FFFAFCEFFAADA5343DADADAE45343FFFAFCEFFAADA5343DADADAE45343FFFAFCE";
0
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
12.07.2016, 21:12 #19
Я имею в виду, что длинную арифметику можно написать так, что для этой задачи деление не понадобится. Но длинную арифметику все равно надо делать (как уже дважды отметил HenryDukart). А результате получишь 572629701186791619150939769357775107963051058342508831759511936655229347335222402996971326188895252492238
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6952 / 3235 / 322
Регистрация: 04.12.2011
Сообщений: 8,928
Записей в блоге: 5
12.07.2016, 21:26 #20
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
#include <iostream>
#include <string> 
using namespace std;
 
int decimal_from_hex_char(char hex)
{
char ret;
if(hex>'0'-1 && hex < '9'+1) ret = hex-'0';
if((hex>'A'-1 && hex < 'F'+1)) ret = 10 + hex - 'A';
if((hex>'a'-1 && hex < 'f'+1)) ret = 10 + hex - 'a';
return ret;
}
string reverse_str(string &str)//г...кодить так уж отдуши))
{
string rev("");
int len=str.size();
for(int i = len-1; i>-1; --i)
{
    rev+=str[i];
}
return rev;
}
 
char char_from_dec(int a){return '0'+a;}
 
string convert_hex_to_decimal(string & hex_str)
{
    string dec_str("");
    int len=hex_str.size(), overlap=0, current;
for(int i = len-1; i>-1; --i)
{
current=overlap+decimal_from_hex_char(hex_str[i]);
overlap=current/10;
dec_str+=char_from_dec(current%10);
}
if(overlap>0)
{
current=overlap;
overlap=current/10;
dec_str+=char_from_dec(current%10);
}
if(overlap>0)dec_str+=char_from_dec(overlap);
return reverse_str(dec_str);
}
 
void main()
{
    char hexes[]={'1', '2', 'A', 'C', 'c', 'f'}; 
for(int i=0; i<6; ++i)cout<< hexes[i]<<" ";
cout<<endl;
for(int i=0; i<6; ++i)cout<< decimal_from_hex_char(hexes[i])<<" ";
cout<<endl;
string hex_str="1AFF";
cout<<hex_str<<endl;
string dec_str=convert_hex_to_decimal(hex_str);//2165
 
cout<<dec_str<<endl;
system("pause");    
}
Если ошибок нет, то этого не может быть.
0
Croessmah
12.07.2016, 21:47
  #21

Не по теме:

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

0
Ferrari F1
623 / 521 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
12.07.2016, 21:50  [ТС] #22
IGPIGP, к сожалению, не получилось
'1', '2', 'A', 'C', 'c', 'f' - я так понял представляется число 12ACCF в hex

По идее результат перевода в dec число должен содержать как минимум столько же цифр, сколько их было изначально в hex, а у вас число цифр в числе уменьшилось)
0
HenryDukart
124 / 124 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
12.07.2016, 21:53 #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);
}
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6952 / 3235 / 322
Регистрация: 04.12.2011
Сообщений: 8,928
Записей в блоге: 5
12.07.2016, 22:08 #24
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
IGPIGP, к сожалению, не получилось
числа цифр там равны: 4 шт. в 1AFF (6911) и столько же в 2165
но логика кривая, да. Цифры 16-ричные а представляют будто десятичные разряды.

Не по теме:

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

0
Mr.X
Эксперт С++
3059 / 1704 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.07.2016, 07:54 #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;
}
1
SergioO
13.07.2016, 11:59
  #26

Не по теме:

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

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

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

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

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

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

Я не знаю как преобрести навык проектирования алгоритма решения задачи.
Может, посоветует кто, как такое умение приобрести?
0
HenryDukart
124 / 124 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
13.07.2016, 14:49 #30
Ferrari F1, книги и практика вам в помощь.
0
13.07.2016, 14:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2016, 14:49
Привет! Вот еще темы с ответами:

Влияет ли манипуляторы hex,oct,dec на массив символов? - C++
Влияет ли манипуляторы hex,oct,dec на массив символов? есть unsigned char str; Ввожу и так cin &gt;&gt; hex &gt;&gt; str; и так cin &gt;&gt; str; ...

Как разбить одно число HEX число на два числа HEX ? - C++
Задача в том, что бы одно число в виде HEX (к примеру 0xD681) разбить на 2 числа HEX (из 0xD681 - &gt; 0xD6 и 0x81) именно что бы вот так...

Перевод данных в hex. - C++
Всем привет! char buffs = {&quot;\x01\x7f\x34\xb0\x80&quot;}; printf(&quot;%02X \n&quot;,buffs); // выводит 01 printf(&quot;%02X \n&quot;,buffs); // выводит 7F ...

Перевод string в hex - C++
Как перевести букву в шестнадцатеричный вид. Например: Г - это 0xC3; Получилось следующее: QString str = &quot;ПРИВЕТ&quot;; ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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