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

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

Восстановить пароль Регистрация
 
 
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 08:10     Универсальный конвертер систем счисления #1
Напишите программу, переводящую запись числа между двумя произвольными системами счисления.

Входные данные
На вход программа получает три величины: 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
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2016, 08:10     Универсальный конвертер систем счисления
Посмотрите здесь:

Универсальный конвертор системы счисления Pascal
Программа обучения переводу чисел из десятичной системы счисления в 2 10 и 16 систем счисления C++
Написать универсальный конвертер, позволяющий переводить из любых мер в любые Lazarus
C# Перевод систем счисления
C (СИ) конвертер из римской системы счисления в арабскую
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
16.10.2016, 09:05     Универсальный конвертер систем счисления #2
Вот ответ здесь: Подскажите, как при заданном числе Х перевести его в систему счисления с основанием n?
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 10:09  [ТС]     Универсальный конвертер систем счисления #3
немного не то, что мне нужно
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
16.10.2016, 10:19     Универсальный конвертер систем счисления #4
немного не то, что мне нужно
А что именно, можете подсказать ?? Как видите я выложил код решающий данную задачу.
Теперь объясните, пожалуйста, что не так ??!!

Добавлено через 8 минут
В качестве значения переменной int base_in указываете основу системы исчисления в которой представлено входное число. Переменной int base_out присваиваете значение основы системы исчисления в которую вы хотите конвертировать. В данном примере я продемонстрировал как осуществить перевод из десятичной (основа 10) в восьмеричную (основа 8) систему исчисления. В принципе основным недостатком данного кода является, то что в процессе перевода из 10 в 16-ричную систему исчисления разряды со значениями от 10-15 не преобразовуются в буквы A-F. Может быть это и есть тот недостаток кода о котором вы говорите ??
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
16.10.2016, 11:29     Универсальный конвертер систем счисления #5
http://www.cyberforum.ru/blogs/18334/blog96.html

Там есть и программа для преобразования, и ответ на вопрос, почему по ссылке в посте #2 задача решена не верно
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 12:53  [ТС]     Универсальный конвертер систем счисления #6
Да это тот недостаток, о котором вы говорите
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
16.10.2016, 12:54     Универсальный конвертер систем счисления #7
Хорошо. Сделаю и выложу.
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 13:13  [ТС]     Универсальный конвертер систем счисления #8
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Хорошо. Сделаю и выложу.
мне бы сам алгоритм понять.. код это так..второстепенное
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
16.10.2016, 13:40     Универсальный конвертер систем счисления #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Алгоритм прост: берем число в любой системе исчисления и присваиваем его переменной. Далее в цикле, при каждой итерации делим данное число на основу системы исчисления, в которую будем конвертировать. Чтобы получить цифру разряда числа в той системе исчисления, в которую конвертируем, необходимо при каждой итерации получать остаток от деления на основу той системы исчисления в которую конвертируем.

Добавлено через 23 минуты
Вот код, который преобразовывает из любой системы исчисления base_in < 16 в любую систему исчисления base_out < 16. Для других систем исчисления base > 16 доделаю и выложу.

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
#include <iostream> 
 
using namespace std;
 
int main()
{
    int n = 256; char s_n[256] = "A10B7CF\0";
    int base_in = 7, base_out = 9;
 
    int t = 0, out_dec = 0;
    // Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
    // путем деления как это уже обговаривалось в предыдущем посте.
    for (int n_val = n; n_val >= 1; n_val /= 10)
         out_dec += (n_val % 10) * int(pow(base_in, t++));
 
    int q = 0, out_t = 0; 
    // Переводим из системы исчисления с основой 10 в любую систему исчисления с основой base_out
    for (int n_val_t = out_dec; n_val_t >= 1; n_val_t /= base_out)
         out_t += (n_val_t % base_out) * int(pow(10.0, q++));
    
    std::cout << "n = " << n << "(" << base_in << ")" << " => " << out_t << "(" << base_out << ")" << endl;
 
    std::cin.get();
}
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 13:41  [ТС]     Универсальный конвертер систем счисления #10
Цитата Сообщение от Invader0x7F Посмотреть сообщение
делим данное число на основу системы исчисления, в которую будем конвертировать.
А если я буду из 10тичной в 19тиричную переводить? То что делать?
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
16.10.2016, 13:42     Универсальный конвертер систем счисления #11
Сказал же, что для систем исчисления base > 16 доделаю данный код и выложу.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
16.10.2016, 13:44     Универсальный конвертер систем счисления #12
Цитата Сообщение от Deniska07 Посмотреть сообщение
мне бы сам алгоритм понять.. код это так..второстепенное
Ну, из этой программы вроде бы ясен алгоритм.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
16.10.2016, 13:50     Универсальный конвертер систем счисления #13
Invader0x7F, у тебя принципиально ничего не изменилось

В статье в общем-то всё по этому поводу было написано. Поставь себе другую задачу, невырожденную, чтобы все косяки сразу же были заметны. На вход задано число, которое в 11-ричной системе записано как "1a8a". Требуется записать это же самое число в 13-ичной системе
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
16.10.2016, 13:52  [ТС]     Универсальный конвертер систем счисления #14
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Сказал же, что для систем исчисления base > 16 доделаю данный код и выложу.
Вы не поняли, каков алгоритм перевода, допустим, числа 13 (12) в (19) систему?
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
16.10.2016, 13:53     Универсальный конвертер систем счисления #15
Я понял. Решаю. Скоро выложу.
minore
204 / 78 / 18
Регистрация: 05.02.2015
Сообщений: 462
16.10.2016, 14:04     Универсальный конвертер систем счисления #16
думаю, что проще всего эту задачу за 2 шага решать: 1) число из системы счисления к переводить в десятичную систему
2) число из десятичной системы в систему счисления м. вот и весь сказ.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
16.10.2016, 14:23     Универсальный конвертер систем счисления #17
Цитата Сообщение от minore Посмотреть сообщение
думаю, что проще всего эту задачу за 2 шага решать: 1) число из системы счисления к переводить в десятичную систему
2) число из десятичной системы в систему счисления м. вот и весь сказ.
Нужно таки понять, что значение и представление числа - это разные вещи.
Сначала из представления в какой-то системе находим значение, затем по значению находим другое представление.
minore
204 / 78 / 18
Регистрация: 05.02.2015
Сообщений: 462
16.10.2016, 14:28     Универсальный конвертер систем счисления #18
Нужно таки понять, что значение и представление числа - это разные вещи.
цитата: Сначала из представления в какой-то системе находим значение, затем по значению находим другое представление.

вы сказали то же что и я, только более сложным языком. есть алгоритм перевода из десятичной системы в любую систему k, есть алгоритм из системы m в десятичную, так давайте условимся, что истинное значение числа - это число в десятичной системе и от этого будем плясать? а то уж вы слишком абстрактно написали ))
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
16.10.2016, 14:36     Универсальный конвертер систем счисления #19
Цитата Сообщение от minore Посмотреть сообщение
так давайте условимся, что истинное значение числа - это число в десятичной системе и от этого будем плясать? а то уж вы слишком абстрактно написали ))
Истинное значение - это которое хранится в переменной типа int. В памяти компьютера оно хранится в двоичной системе, выводится на монитор по умолчанию в десятичной, но можно вывести в одной из нескольких других по желанию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2016, 14:41     Универсальный конвертер систем счисления
Еще ссылки по теме:

Lazarus Конвертер систем счисления
Преобразование из систем счисления Delphi
Перевод систем счисления Java SE

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

Или воспользуйтесь поиском по форуму:
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
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();
}
Миниатюры
Универсальный конвертер систем счисления  
Yandex
Объявления
16.10.2016, 14:41     Универсальный конвертер систем счисления
Ответ Создать тему
Опции темы

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