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

Перевод в заданную систему счисления - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Fafle
 Аватар для Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
21.04.2010, 00:10     Перевод в заданную систему счисления #1
Дано задание:
Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число должно переводится (системы счисления от 2 до 36). Например, при переводе числа 27 в систему счисления 16 должно получиться 1B; 13 в 5-ю - 23; 35 в 18-ю - 1H.
Мне не нужен код, всего лишь объясните плз принцип работы перевода в систему счисления.
Вопрос мб не в тему, но погуглив начинаю впадать в истерику, да мб я дурак, если не трудно объясните плз.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
21.04.2010, 09:30     Перевод в заданную систему счисления #2
По принципу разделяй и властвуй )))
Т.е. делением...
Делишь число на основание степени до тех пор, пока нечего будет делить, а затем выписываешь остатки от делений в обратном порядке - это и будет твой результат.
Пара примеров:

30 перевести в двоичную систему:
30/2 = 15 (0) - в скобках остаток от деления
15/2 = 7 (1)
7/2 = 3 (1)
3/2 = 1 (1) - т.к. результат меньше делителя, прекращаем операцию и оставшуюся единицу тоже учитываем:
01111
итак, переворачиваем остатки и получаем результат: 11110

Еще пример: 1034 перевести в 17-ичную систему
1034/17 = 60 (14) = 60 (D)
60/17 = 3 (9) делимое меньше делителя, прекращаем делить и учитываем оставшуюся тройку:
D93 переворачиваем 39D
stv
26 / 26 / 6
Регистрация: 05.03.2010
Сообщений: 171
21.04.2010, 14:33     Перевод в заданную систему счисления #3
Может функцией сначало переводим в строку функцией itoa(), а потом обратно в число функцией strtol() уже указывая свое основание?
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
21.04.2010, 17:43     Перевод в заданную систему счисления #4
2stv: обычно так и делают
cashivk
Сообщений: n/a
25.02.2014, 19:48     Перевод в заданную систему счисления #5
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
#include <iostream>
#include<windows.h>
 
using namespace std;       
    
int main()
{
    system("chcp 1251>text");
 
int number,b; 
 
cout<<"Введиет число (number): "<<endl;
cin>>number;
 
 
do
{ cout<<"Неккоректный ввод данных! Повториет ввод: "<<endl;
  cin>>number;
}
while(number<1);
 
cout<<"Введите число b (систему счисления): "<<endl;
cin>>b;
 
do
{ cout<<"Неккоректный ввод данных! Повториет ввод: "<<endl;
  cin>>b;
}
while(b<2);
   
 int i=0,
     t=0,
      mas[number],
      s;   
 do
 {
         
   mas[i]=number%b;
     number=number/b;   
     i=i+1;
     t=t+1;
     }
 while (number!=0);   
  
    for(i=0;i<t/2;i++)
{
     s=mas[i];
     mas[i]=mas[t-i-1];
     mas[t-i-1]=s;
     }    
     
cout<<endl;
cout<<"Число в "<<b<<"-чной системе счисления: ";
 
for(i=0; i<t;i++)
{
    cout<<mas[i];
     }   
cout<<endl;
 
cout<<"\n\n"<<endl;
system("pause");
 
return 0;
}
Liden
17 / 17 / 2
Регистрация: 19.11.2013
Сообщений: 83
25.02.2014, 20:41     Перевод в заданную систему счисления #6
Fafle, посмотри Шилда. Можно с помощью побитывых операций сделать 2-ую) и по тому же принципу другие системы счисления)
DebuggeR94
 Аватар для DebuggeR94
2 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 21
02.05.2016, 12:00     Перевод в заданную систему счисления #7
Писал для себя, выкладываю может пригодится кому, критика приветствуется)
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
112
113
114
#include <iostream>
#include <clocale>
#include <windows.h>
 
using std::cout;
using std::cin;
 
void NumSysConvert(int number, int numsys);
char NumInLet(int number);
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int number(0), numsys(0);
 
    cout << "введите число: ";
    cin >> number;
 
    while (TRUE)
    {
        cout << "введите систему счисления: ";
        cin >> numsys;
        if (numsys >= 2 && numsys <= 36)
            break;
        system("cls");
        cout << "неверная система счисления!\n";
        cout << "введенное число: " << number << "\n";
    }
 
    NumSysConvert(number, numsys);
 
    system("pause");
    return 0;
}
 
void NumSysConvert(int number, int numsys)
{
    char *buff = new char[256];
    int count(0);
    while (number)
    {
        buff[count] = NumInLet(number % numsys);
        number /= numsys;
        count++;
    }
    cout << "в (" << numsys << ") системе счисления: ";
    while (count > 0)
    {
        cout << buff[count-1];
        count--;
    }
    cout << "\n";
}
 
char NumInLet(int number) 
{
    switch (number) {
    case(10):
        return 'A';
    case(11):
        return 'B';
    case(12):
        return 'C';
    case(13):
        return 'D';
    case(14):
        return 'E';
    case(15):
        return 'F';
    case(16):
        return 'G';
    case(17):
        return 'H';
    case(18):
        return 'I';
    case(19):
        return 'J';
    case(20):
        return 'K';
    case(21):
        return 'L';
    case(22):
        return 'M';
    case(23):
        return 'N';
    case(24):
        return 'O';
    case(25):
        return 'P';
    case(26):
        return 'Q';
    case(27):
        return 'R';
    case(28):
        return 'S';
    case(29):
        return 'T';
    case(30):
        return 'U';
    case(31):
        return 'V';
    case(32):
        return 'W';
    case(33):
        return 'X';
    case(34):
        return 'Y';
    case(35):
        return 'Z';
    default:
        return (char) number + '0';
    }
}
ну еще по желанию можно проверку на положительность числа туда засунуть)
madfax
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 15
07.06.2016, 15:04     Перевод в заданную систему счисления #8
прошу принять во внимание , если на экран ничего не выводится
может быть вы указали значение которое выходит за допустимый диапазон type var_decimal_namber
в этом случае short

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
void convert(short, short);
 
void main(){
    short num, sys;
 
    do{
        cout << "decimal ; any system\n";
        cin >> num >> sys;
    } while ((num && sys) > 1);
 
    convert(num, sys);
}
 
void convert(short decimal_number, short system){
    short tmp = 0;
 
    cout << "\t";    //placeholder for '\b'
    while (decimal_number > 0)
    {
        tmp = decimal_number % system;
        (tmp > 9) ? cout << char(tmp + 55) << "\b\b" : cout << tmp << "\b\b";
        decimal_number /= system;
    }
    cout << endl;
}
hakis
0 / 0 / 0
Регистрация: 30.07.2016
Сообщений: 1
30.07.2016, 13:47     Перевод в заданную систему счисления #9
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <iostream>
using namespace std;
 
 
void my_function(int Numbar, int Degree)
{
    
    const int hit = 1000;
    int mas[hit];
 
    int shet = 0;
 
    Numbar;
    Degree;
 
 
 
    if (Degree == 2)
    {
        Numbar += Numbar;
 
        for (Numbar > 0; Numbar /= Degree; ++shet)
        {
            if (Numbar % 2 == 0)
 
                mas[shet] = 0;
 
            else
 
                mas[shet] = 1;
        }
 
        --shet;
 
        for (int i = shet; i >= 0; i--)
        {
            cout << mas[i];
        }
        
    }
    
 
    if (Degree == 8)
    {
        for (;;)
        {
            if (Numbar <= 0)
 
                break;
 
            int bank = Numbar;
 
            Numbar /= Degree;
 
            int t = Numbar*Degree;
 
            int res = bank - t;
 
            mas[shet] = res;
 
            shet++;
 
        }
 
 
 
        shet--;
 
        for (int i = shet; i >= 0; i--)
        {
            cout << mas[i];
        }
 
    }
    
 
    if (Degree == 16)
    {
        for (;;)
        {
            if (Numbar <= 0)
 
                break;
 
            int bank = Numbar;
 
            Numbar /= Degree;
 
            int t = Numbar*Degree;
 
            int res = bank - t;
 
            mas[shet] = res;
 
            shet++;
 
        }
 
 
 
        shet--;
 
        for (int i = shet; i >= 0; i--)
        {
            if (mas[i] == 10)
 
                cout << "A";
 
            else if (mas[i] == 11)
 
                cout << "B";
 
            else if (mas[i] == 12)
 
                cout << "C";
 
            else if (mas[i] == 13)
 
                cout << "D";
 
            else if (mas[i] == 14)
 
                cout << "E";
 
            else if (mas[i] == 15)
 
                cout << "F";
 
            else
 
                cout << mas[i];
 
        }
 
    }
}
 
 
int main()
{
    int a, b;
    cout << "Select the number system (2,8,16)>> ";
    cin >> a;
 
    cout << "Number>> ";
    cin >> b;
 
    my_function(b, a);
 
    cout << endl;
 
}
VaLc_DD
0 / 0 / 0
Регистрация: 17.06.2016
Сообщений: 13
05.08.2016, 14:19     Перевод в заданную систему счисления #10
А как можно сделать так, чтобы этими данными потом можно было воспользоваться? То есть возвращать их в мейн?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2016, 15:15     Перевод в заданную систему счисления
Еще ссылки по теме:

Перевод в 12-ричную систему счисления C++
Перевод чисел из 10 в 15 систему счисления C++
C++ Перевод строки из 2-ной системы счисления в 8-ную систему счисления

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

Или воспользуйтесь поиском по форуму:
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
05.08.2016, 15:15     Перевод в заданную систему счисления #11
Вот примерчик законченного решения завалялся:
Кликните здесь для просмотра всего текста
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
#include <string>
#include <array>
#include <cstdlib>
 
template <unsigned Base>
constexpr size_t digits(unsigned int v = -1u, size_t count = 0)
{
    return v == 0 ? count : digits<Base>(v / Base, count + 1);
}
template <unsigned int Base>
struct int_storage    // for all systems except binary
    : std::array<char, digits<Base>() + 2> /*1 for zero, 1 for minus */
{ };
template <>
struct int_storage<2> // for binary
    : std::array<char, digits<2>() + 1> /*1 for zero */
{ };
 
template <unsigned int Base>
std::string tostring(int value)
{
    static_assert(Base > 1 && Base < 37, "Only 2..36 bases are accepted!");
    int_storage<Base> storage;
    struct
    {
        unsigned int quot;
 
        size_t index()
        {
            unsigned int const q = quot;
            quot /= Base;
            return q % Base;
        }
    } r = { static_cast<unsigned int>( Base == 2 ? value : std::abs(value) ) };
    char * sp = &storage[storage.size() - 1];
    *sp = 0;
    do
    {
        *--sp = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[r.index()];
    }
    while(r.quot != 0);
 
    if(Base != 2 && value < 0)
    {
        *--sp = '-';
    }
    return sp;
}
В принципе, кому нужно, может убрать шаблон и расчет оптимального буфера по СС, сделать обычную функцию с параметром основания системы счисления. Код переделать несложно.

Онлайн демка: http://rextester.com/MFIR7591
Yandex
Объявления
05.08.2016, 15:15     Перевод в заданную систему счисления
Ответ Создать тему
Опции темы

Текущее время: 00:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru