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

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

Войти
Регистрация
Восстановить пароль
 
 
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
#1

Универсальный конвертер систем счисления - C++

16.10.2016, 08:10. Просмотров 1531. Ответов 38
Метки нет (Все метки)

Напишите программу, переводящую запись числа между двумя произвольными системами счисления.

Входные данные
На вход программа получает три величины: n, A, k, где n и k – натуральные числа от 2 до 36, основания системы счисления, A – число, записанное в в системе счисления с основанием n, A<231.

Выходные данные
Необходимо вывести значение A в системе счисления с основанием k без лидирующих нулей.

Цифры записываются следующими символами: 0, 1, 2, ..., 9, A, B, C, ..., Z.

Примеры
входные данные
10
19
2

выходные данные
10011
входные данные
10
32
3

выходные данные
1012

язык с++, python, в крайнем случае pascal

Добавлено через 15 минут
А < 2 в степени 31
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2016, 08:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Универсальный конвертер систем счисления (C++):

Программа обучения переводу чисел из десятичной системы счисления в 2 10 и 16 систем счисления - C++
дали задание составить программу нужно чтобы на экран выводилось это: Программа обучение переводу чисел из десятичной систем...

Конвертер систем счислений из 10-й в 2 || 8 || 16 - C++
Неделю назад начал изучать язык C++, и пока знаю только базовые основы, ночью думал как себя протестировать, чтобы закрепить изученное, в...

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

Перевод систем счисления - C++
Здравствуйте,помогите пожалуйста доработать программу перевода числа в разные системы счисления.Нужно чтобы заместо цифр 10 11 12 13 14...

перевод систем счисления - C++
1. Задание: Напишите программу перевода чисел из 2 системы в 10. 2.Задание: Напишите программу выполнения арифметических операций в...

Перевод систем счисления - C++
Здраствуйте, на входе имеется некое десятеричное число (примеры:1 / 2,8 / 0,123456) как перевести в другую систему счисления пробовал...

38
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
16.10.2016, 14:04 #16
думаю, что проще всего эту задачу за 2 шага решать: 1) число из системы счисления к переводить в десятичную систему
2) число из десятичной системы в систему счисления м. вот и весь сказ.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2016, 14:23 #17
Цитата Сообщение от minore Посмотреть сообщение
думаю, что проще всего эту задачу за 2 шага решать: 1) число из системы счисления к переводить в десятичную систему
2) число из десятичной системы в систему счисления м. вот и весь сказ.
Нужно таки понять, что значение и представление числа - это разные вещи.
Сначала из представления в какой-то системе находим значение, затем по значению находим другое представление.
0
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
16.10.2016, 14:28 #18
Нужно таки понять, что значение и представление числа - это разные вещи.
цитата: Сначала из представления в какой-то системе находим значение, затем по значению находим другое представление.

вы сказали то же что и я, только более сложным языком. есть алгоритм перевода из десятичной системы в любую систему k, есть алгоритм из системы m в десятичную, так давайте условимся, что истинное значение числа - это число в десятичной системе и от этого будем плясать? а то уж вы слишком абстрактно написали ))
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2016, 14:36 #19
Цитата Сообщение от minore Посмотреть сообщение
так давайте условимся, что истинное значение числа - это число в десятичной системе и от этого будем плясать? а то уж вы слишком абстрактно написали ))
Истинное значение - это которое хранится в переменной типа int. В памяти компьютера оно хранится в двоичной системе, выводится на монитор по умолчанию в десятичной, но можно вывести в одной из нескольких других по желанию.
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
16.10.2016, 14:41 #20
Вот написал, проверяйте:
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
#include <iostream> 
 
using namespace std;
 
int main()
{
    __int64 n = 256; 
    __int64 base_in = 11, base_out = 13;
    char s_n[256] = "1A8A\0", s_out[256] = "\0";
 
    if (base_in < 11 && base_out < 11)
    {
        __int64 t = 0, out_dec = 0;
        // Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
        // путем деления как это уже обговаривалось в предыдущем посте.
        for (__int64 n_val = n; n_val >= 1; n_val /= 10)
            out_dec += (n_val % 10) * __int64(pow(base_in, t++));
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            out_t += (n_val_t % base_out) * __int64(pow(10.0, q++));
 
        std::cout << "n = " << n << "(" << base_in << ")" << " => " << out_t << "(" << base_out << ")" << endl;
    }
 
    else if (base_in >= 11 && base_out < 11)
    {
        __int64 out_dec = 0; __int64 t = 0;
        for (__int64 r = strlen(s_n) - 1; r >= 0; r--)
        {
            __int64 n_digit = ((s_n[r] >= 'A') && (s_n[r] <= 'F')) ? 
                (s_n[r] - 'A') + 10 : (s_n[r] - '0');
 
            out_dec += n_digit * __int64(pow(base_in, t++));
        }
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            out_t += (n_val_t % base_out) * __int64(pow(10.0, q++));
 
        std::cout << "n = " << n << "(" << base_in << ")" << " => " << out_t << "(" << base_out << ")" << endl;
    }
 
    else if (base_in < 11 && base_out >= 11)
    {
        __int64 t = 0, out_dec = 0;
        // Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
        // путем деления как это уже обговаривалось в предыдущем посте.
        for (__int64 n_val = n; n_val >= 1; n_val /= 10)
            out_dec += (n_val % 10) * __int64(pow(base_in, t++));
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            s_out[q++] = ((char)((n_val_t % base_out) < 10 ? (n_val_t % base_out) + '0' : ('A' + ((n_val_t % base_out) - 10))));
 
        int m = strlen(s_out) - 1;
        for (int v = 0; v < strlen(s_out) / 2; v++, m--)
            std::swap(s_out[v], s_out[m]);
 
        std::cout << "s_n = " << s_n << "(" << base_in << ")" << " => " << s_out << "(" << base_out << ")" << endl;
    }
 
    else if (base_in >= 11 && base_out >= 11)
    {
        __int64 out_dec = 0; __int64 t = 0;
        for (__int64 r = strlen(s_n) - 1; r >= 0; r--)
        {
            __int64 n_digit = ((s_n[r] >= 'A') && (s_n[r] <= 'F')) ?
                (s_n[r] - 'A') + 10 : (s_n[r] - '0');
 
            out_dec += n_digit * __int64(pow(base_in, t++));
        }
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            s_out[q++] = ((char)((n_val_t % base_out) < 10 ? (n_val_t % base_out) + '0' : ('A' + ((n_val_t % base_out) - 10))));
 
        int m = strlen(s_out) - 1;
        for (int v = 0; v < strlen(s_out) / 2; v++, m--)
            std::swap(s_out[v], s_out[m]);
 
        std::cout << "s_n = " << s_n << "(" << base_in << ")" << " => " << s_out << "(" << base_out << ")" << endl;
    }
 
    std::cin.get();
}
0
Миниатюры
Универсальный конвертер систем счисления  
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
16.10.2016, 14:42 #21
"Истинное значение - это которое хранится в переменной типа int. В памяти компьютера оно хранится в двоичной системе, выводится на монитор по умолчанию в десятичной, но можно вывести в одной из нескольких других по желанию."
но ведь что нам тольу, что числа в компьютере в двоичном виде хранятся, если нам удобно в десятичной считать? да, и ваше предложение-то какое? вот уже и код выложили по тому же алгоритму, через десятичную систему.
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
16.10.2016, 14:44 #22
Deniska07, вот написал проверяйте:
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
#include <iostream> 
 
using namespace std;
 
int main()
{
    __int64 n = 256; 
    __int64 base_in = 11, base_out = 13;
    char s_n[256] = "1A8A\0", s_out[256] = "\0";
 
    if (base_in < 11 && base_out < 11)
    {
        __int64 t = 0, out_dec = 0;
        // Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
        // путем деления как это уже обговаривалось в предыдущем посте.
        for (__int64 n_val = n; n_val >= 1; n_val /= 10)
            out_dec += (n_val % 10) * __int64(pow(base_in, t++));
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            out_t += (n_val_t % base_out) * __int64(pow(10.0, q++));
 
        std::cout << "n = " << n << "(" << base_in << ")" << " => " << out_t << "(" << base_out << ")" << endl;
    }
 
    else if (base_in >= 11 && base_out < 11)
    {
        __int64 out_dec = 0; __int64 t = 0;
        for (__int64 r = strlen(s_n) - 1; r >= 0; r--)
        {
            __int64 n_digit = ((s_n[r] >= 'A') && (s_n[r] <= 'F')) ? 
                (s_n[r] - 'A') + 10 : (s_n[r] - '0');
 
            out_dec += n_digit * __int64(pow(base_in, t++));
        }
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            out_t += (n_val_t % base_out) * __int64(pow(10.0, q++));
 
        std::cout << "n = " << n << "(" << base_in << ")" << " => " << out_t << "(" << base_out << ")" << endl;
    }
 
    else if (base_in < 11 && base_out >= 11)
    {
        __int64 t = 0, out_dec = 0;
        // Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
        // путем деления как это уже обговаривалось в предыдущем посте.
        for (__int64 n_val = n; n_val >= 1; n_val /= 10)
            out_dec += (n_val % 10) * __int64(pow(base_in, t++));
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            s_out[q++] = ((char)((n_val_t % base_out) < 10 ? (n_val_t % base_out) + '0' : ('A' + ((n_val_t % base_out) - 10))));
 
        int m = strlen(s_out) - 1;
        for (int v = 0; v < strlen(s_out) / 2; v++, m--)
            std::swap(s_out[v], s_out[m]);
 
        std::cout << "s_n = " << s_n << "(" << base_in << ")" << " => " << s_out << "(" << base_out << ")" << endl;
    }
 
    else if (base_in >= 11 && base_out >= 11)
    {
        __int64 out_dec = 0; __int64 t = 0;
        for (__int64 r = strlen(s_n) - 1; r >= 0; r--)
        {
            __int64 n_digit = ((s_n[r] >= 'A') && (s_n[r] <= 'F')) ?
                (s_n[r] - 'A') + 10 : (s_n[r] - '0');
 
            out_dec += n_digit * __int64(pow(base_in, t++));
        }
 
        __int64 q = 0, out_t = 0;
        // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
        for (__int64 n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
            s_out[q++] = ((char)((n_val_t % base_out) < 10 ? (n_val_t % base_out) + '0' : ('A' + ((n_val_t % base_out) - 10))));
 
        int m = strlen(s_out) - 1;
        for (int v = 0; v < strlen(s_out) / 2; v++, m--)
            std::swap(s_out[v], s_out[m]);
 
        std::cout << "s_n = " << s_n << "(" << base_in << ")" << " => " << s_out << "(" << base_out << ")" << endl;
    }
 
    std::cin.get();
}
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2016, 14:57 #23
Цитата Сообщение от minore Посмотреть сообщение
да, и ваше предложение-то какое?
Цитата Сообщение от Mr.X Посмотреть сообщение
таки понять, что значение и представление числа - это разные вещи.
Почему вы решили, что в этом коде перевод именно в десятичную систему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        for( auto   dig     :   digits )
        {
            bool_res    =   dig_is_correct_for_base
                                (
                                    dig,
                                    base
                                );
 
            if( !bool_res )
            {
                break;
            }
 
            val_    *=  base;
            val_    +=  dig;
        }//for
0
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
16.10.2016, 15:09 #24
просто из комментариев, которыми сопроводил свой код автор
цитата:
C++
1
2
// Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
// путем деления как это уже обговаривалось в предыдущем посте.
"
соответствуют ли комментарии коду не вникал.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2016, 15:14 #25
Цитата Сообщение от minore Посмотреть сообщение
просто из комментариев, которыми сопроводил свой код автор
Это вы сейчас с кем разговаривали? Если со мной, то вы меня с каким-то другим "автором" перепутали.
И научитесь уже цитировать сообщения, на которые отвечаете.
0
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
16.10.2016, 15:24 #26
я имею ввиду того автора, который код выложил ) вы вроде как в этой теме никаких наработок не выкладывали, ну или я пропустил.

Добавлено через 6 минут
его ник Invader0x7F.
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,822
Записей в блоге: 28
16.10.2016, 15:30 #27
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Deniska07, вот написал проверяйте
Переведи при помощи своей программы число, запись которого есть "1234" в 5-ричной системе в 7-ричную систему
0
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 17:36  [ТС] #28
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Вот написал, проверяйте:
странно.. у меня компилироваться не хочет

Добавлено через 24 минуты
Цитата Сообщение от Deniska07 Посмотреть сообщение
Invader0x7F
А почему у вас в коде везде написано 11?
if (base_in < 11 && base_out < 11) здесь например
объясните пожалуйста
0
minore
250 / 124 / 30
Регистрация: 05.02.2015
Сообщений: 696
16.10.2016, 18:23 #29
хотели алгоритм, получайте на примере: есть число 1234 в системе счисления 5, переводим в систему счисления 7.
шаг 1: перевод в десятичную систему: 1*5^3 + 2*5^2 + 3*5 + = 125 + 50 + 15 + 4 = 169;
шаг 2 переводим число 169 в семеричную систему: 169/7 = 14(1) 14/7 = 2(0) и того: 201. хотели алгоритм, получите. никто ничего лучше и проще не придумает. информатика, школьная программа.

Добавлено через 29 минут
на шаге 2 допустил ошибку и так, заново: 169/7 = 24(1), 24/7 = 3(3) и того: 331. делаем проверку: обратно в 10 систему: 331 = 3*49 + 3*7 + 1 = 147 + 22 = 169, что и требовалось доказать. можете потренироваться переведя обратно в систему счисления 5.
0
Catstail
Модератор
22909 / 11275 / 1833
Регистрация: 12.02.2012
Сообщений: 18,487
16.10.2016, 19:44 #30
Что-то не нравятся мне эти решения... Мне представляется, что универсальный конвертор должен брать строку и два целых: исходное основание и результирующее основание, а возвращать тоже строку. При этом int используется для хранения промежуточного результата.

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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
char *Digits="0123456789ABCDEFGHIJKLMNOPQTSTUVWXYZ";
 
// Дать позицию цифры
 
int Dig(char c)
{
    int i;
    for (i=0; i<36; i++) if (c==Digits[i]) return i;
    return -1;
}    
 
// Перевод числа, заднного строкой Num в основании ri
// в систему с основанием ro
 
char *UConv(char *Num, int ri, int ro)
{
   char Buf[100];
   char *res;
   int z=0,i,j,k,sz,n=strlen(Num);
   
   for (i=0; i<n; i++) z=z*ri+Dig(Num[i]);
   
   for (i=0; i<100; i++) Buf[i]=0;
   
   j=99;
   
   while(z>0)
   {
     k=(z % ro);            
     Buf[j--]=Digits[k];
     z=z/ro;
   }  
   
   sz=100-j;
   res=new char[sz];
   
   j++;
   
   for (i=0; i<sz-1; i++) res[i]=Buf[j++];
   res[sz-1]=0;
   
   return res;
 
}    
 
 
int main(int argc, char *argv[])
{
    
    char *S="AB5";
    char *R;
    
    R=UConv(S,20,10);
    
    cout << R << endl;
    
    delete [] R;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
16.10.2016, 19:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2016, 19:44
Привет! Вот еще темы с ответами:

Функция перевода систем счисления - C++
Написать функцию с параметром перевода десятичного числа из системы с основанием меньше 10 в десятичную систему счисления

умножение чисел систем счисления - C++
задание: Написать программу для выполнения арифметических операций в разных системах счисления. вариант: 13. Числа по основанию 8 и 4....

перевод чисел из систем счисления - C++
Составить программу перевода чисел из десятичной системы счисления в систему с основанием: 12; 31; 3; и программу обратного перевода

Программа перевода систем счисления - C++
Не могу написать программу по переводу числа из 10-ой в 2-ую. Смотрел другие темы не понял да и программы там не понятные были. Если...


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

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

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