Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Fafle
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
#1

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

21.04.2010, 00:10. Просмотров 4318. Ответов 11
Метки нет (Все метки)

Дано задание:
Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число должно переводится (системы счисления от 2 до 36). Например, при переводе числа 27 в систему счисления 16 должно получиться 1B; 13 в 5-ю - 23; 35 в 18-ю - 1H.
Мне не нужен код, всего лишь объясните плз принцип работы перевода в систему счисления.
Вопрос мб не в тему, но погуглив начинаю впадать в истерику, да мб я дурак, если не трудно объясните плз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2010, 00:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перевод в заданную систему счисления (C++):

Перевод натурального числа из десятичной системы счисления в систему счисления по основанию
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень...

Рекурсия: перевод целого числа из десятичной системы счисления в 9 систему счисления
Написать рекурсивную функцию перевода целого числа из десятичной системы...

Перевод строки из 2-ной системы счисления в 8-ную систему счисления
помогите пожалуйста как сделать перевод строки из 2 системы счисления на 8...

Перевод числа из восьмеричной системы счисления в шестнадцатеричную систему счисления
Вот пример числа: 754 = 1EC 1000 = 200

Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно
Нужно две программы, одна реализует перевод чисел из двоичной системы счисления...

Перевод чисел из 16 системы счисления в 2 систему счисления
Помогите составить программу для перевод чисел из 16 с/c в 2 c/c при...

11
Haster
инженер-системотехник
111 / 110 / 5
Регистрация: 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
0
stv
26 / 26 / 3
Регистрация: 05.03.2010
Сообщений: 171
21.04.2010, 14:33 #3
Может функцией сначало переводим в строку функцией itoa(), а потом обратно в число функцией strtol() уже указывая свое основание?
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
21.04.2010, 17:43 #4
2stv: обычно так и делают
0
cashivk
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 1
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;
}
0
Liden
19 / 19 / 3
Регистрация: 19.11.2013
Сообщений: 83
25.02.2014, 20:41 #6
Fafle, посмотри Шилда. Можно с помощью побитывых операций сделать 2-ую) и по тому же принципу другие системы счисления)
0
DebuggeR94
3 / 1 / 1
Регистрация: 06.01.2015
Сообщений: 24
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';
    }
}
ну еще по желанию можно проверку на положительность числа туда засунуть)
0
madfax
1 / 1 / 2
Регистрация: 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;
}
0
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;
 
}
0
VaLc_DD
0 / 0 / 0
Регистрация: 17.06.2016
Сообщений: 36
05.08.2016, 14:19 #10
А как можно сделать так, чтобы этими данными потом можно было воспользоваться? То есть возвращать их в мейн?
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
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
0
Max2199
0 / 0 / 0
Регистрация: 13.10.2017
Сообщений: 1
04.12.2017, 00:25 #12
Вот хороший вариант для новичков, взял с выше....Компилятор больше не ругаеться....
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
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int number, b;
 
    cout << "Введиет число :\n ";
    cin >> number;
 
    cout << "Введите систему счисления: \n";
    cin >> b;
 
    int i = 0,t = 0,mas[5],s;
    do
    {
 
        mas[i] = number%b;
        number = number / b;
        i ++;
        t ++;
    } 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 << "\n";
    cout << "Число в " << b << "-чной системе счисления:\n ";
 
    for (i = 0; i<t; i++)
    {
        cout << mas[i];
    }
    cout << "\n\n";
 
}
0
04.12.2017, 00:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2017, 00:25
Привет! Вот еще темы с решениями:

Написать функцию перевода в заданную систему счисления
3.Написать функцию, которая получает в качестве аргументов целое положительное...

Рекурсивная функция для перевода данного натурального числа в заданную систему счисления
Составить рекурсивную функцию для перевода данного натурального числа в р-ичную...

Перевод из 2-ой в 10-ую систему счисления
как делать?

Перевод из 16 в 10 и 2 систему счисления
Кто сможет написать код на с++ IDE Dev c++. Что бы переводила в 10 и 2...


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

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

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