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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
#1

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

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

Дано задание:
Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число должно переводится (системы счисления от 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++):

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

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

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

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

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

Рекурсивная функция для перевода данного натурального числа в заданную систему счисления - C++
Составить рекурсивную функцию для перевода данного натурального числа в р-ичную систему счисления (2<= р<= 9). Только начали проходить...

10
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
0
stv
26 / 26 / 6
Регистрация: 05.03.2010
Сообщений: 171
21.04.2010, 14:33 #3
Может функцией сначало переводим в строку функцией itoa(), а потом обратно в число функцией strtol() уже указывая свое основание?
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
21.04.2010, 17:43 #4
2stv: обычно так и делают
0
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
19 / 19 / 2
Регистрация: 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 / 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;
}
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
Сообщений: 13
05.08.2016, 14:19 #10
А как можно сделать так, чтобы этими данными потом можно было воспользоваться? То есть возвращать их в мейн?
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
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
05.08.2016, 15:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2016, 15:15
Привет! Вот еще темы с ответами:

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

Перевод чисел из 10 в 15 систему счисления - C++
Доброго времени суток. Нужно написать программу для перевода введенных с клавиатуры чисел из 10 системы 15 систему счисления, без...

Перевод из десятичной в N систему счисления - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main () { int osn2, chislo,z=0,i=0,a,b; ...

Перевод в 9-чную систему счисления - C++
есть задача, что бы решить ее до конца мне надо сделать перевод из 10-тичной(можно любой другой) в девятиричную систему счисления я бы...


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

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

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