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
| //----------------------------------------------------------------------------
#include <iostream>
#include <sstream>
const std::string alphabet = "0123456789abcdefghijklmnopqrstuvwxyz";
typedef unsigned int UI;
//---------------------------------------------------------------реверс строки
void Reverse (std::string &str)
{
UI i = -1, j = str.length();
while (++i < --j)
{
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
//--------------------------------------------проверка соответствия числа системе
bool ValidNumber (std::string &num, int base)
{
if (base < 2 || base > 36)
return false;
UI i = -1;
while (++i < num.length())
if (alphabet.find(num[i]) >= base)
return false;
return true;
}
//---------------------------------------------------десятичное в любую систему
bool DecimalToBase(UI num, int dest_base, std::string &dest)
{
if (dest_base < 2 || dest_base > 36)
return false;
while (num)
{ dest += alphabet [num % dest_base];
num /= dest_base;
}
Reverse (dest);
return true;
}
//---------------------------------------------------из любой системы в десятичное
bool BaseToDecimal (std::string &source, int source_base, UI &num)
{
if (source_base < 2 || source_base >36)
return false;
if (!ValidNumber (source, source_base))
return false;
Reverse (source);
UI i = -1, shift = 1;
while (++i < source.length())
{
num += alphabet.find(source[i]) * shift;
shift *= source_base;
}
return true;
}
//--------------------------------------------------из любой системы в любую систему
bool BaseToBase (int source_base, std::string &source, int dest_base, std::string &dest)
{
if (source_base < 2 || source_base >36 || dest_base < 2 || dest_base > 36)
return false;
if (!ValidNumber (source, source_base))
return false;
UI temp = 0;
if (source_base != 10)
BaseToDecimal (source, source_base, temp);
DecimalToBase (temp, dest_base, dest);
return true;
}
//----------------------------------------------------------------------------
int main()
{
//перевод из десятичной в любую систему
std::string res = "\0";
DecimalToBase (12345, 16, res);
std::cout << res << "\n";
//перевод из любой в десятичную
UI num = 0;
res = "ff";
BaseToDecimal (res, 16, num);
std::cout << num << "\n";
//перевод из любой в любую
std::string source = "123456";
std::string dest = "\0";
BaseToBase (7, source, 16, dest);
std::cout << dest;
std::cin.get();
return 0;
}
//----------------------------------------------------------------------------- |