Форум программистов, компьютерный форум 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 (СИ) конвертер из римской системы счисления в арабскую
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
minore
207 / 81 / 18
Регистрация: 05.02.2015
Сообщений: 467
16.10.2016, 14:42     Универсальный конвертер систем счисления #21
"Истинное значение - это которое хранится в переменной типа int. В памяти компьютера оно хранится в двоичной системе, выводится на монитор по умолчанию в десятичной, но можно вывести в одной из нескольких других по желанию."
но ведь что нам тольу, что числа в компьютере в двоичном виде хранятся, если нам удобно в десятичной считать? да, и ваше предложение-то какое? вот уже и код выложили по тому же алгоритму, через десятичную систему.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
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();
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
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
minore
207 / 81 / 18
Регистрация: 05.02.2015
Сообщений: 467
16.10.2016, 15:09     Универсальный конвертер систем счисления #24
просто из комментариев, которыми сопроводил свой код автор
цитата:
C++
1
2
// Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
// путем деления как это уже обговаривалось в предыдущем посте.
"
соответствуют ли комментарии коду не вникал.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
16.10.2016, 15:14     Универсальный конвертер систем счисления #25
Цитата Сообщение от minore Посмотреть сообщение
просто из комментариев, которыми сопроводил свой код автор
Это вы сейчас с кем разговаривали? Если со мной, то вы меня с каким-то другим "автором" перепутали.
И научитесь уже цитировать сообщения, на которые отвечаете.
minore
207 / 81 / 18
Регистрация: 05.02.2015
Сообщений: 467
16.10.2016, 15:24     Универсальный конвертер систем счисления #26
я имею ввиду того автора, который код выложил ) вы вроде как в этой теме никаких наработок не выкладывали, ну или я пропустил.

Добавлено через 6 минут
его ник Invader0x7F.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
16.10.2016, 15:30     Универсальный конвертер систем счисления #27
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Deniska07, вот написал проверяйте
Переведи при помощи своей программы число, запись которого есть "1234" в 5-ричной системе в 7-ричную систему
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) здесь например
объясните пожалуйста
minore
207 / 81 / 18
Регистрация: 05.02.2015
Сообщений: 467
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.
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
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;
}
Deniska07
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
17.10.2016, 09:41  [ТС]     Универсальный конвертер систем счисления #31
Цитата Сообщение от Catstail Посмотреть сообщение
Что-то не нравятся мне эти решения...
А ваша программа справится с 16 ричной системой?

Добавлено через 13 часов 16 минут
Вот это ответ!

Добавлено через 1 минуту
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
#include <iostream>
#include <cstring>
#define DIG "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
using namespace std;
 
int Atoi(char *s, int p){
    int i, a, digit[256] = {0};
    for(i = 0; DIG[i]; i++)
        digit[DIG[i]] = i;
    for(i = a = 0; s[i]; i++)
        a = a * p + digit[s[i]];
    return a;
}
 
void Itoa(int a, int p, char *s) {
   static int i = 0, n;
   if (a) {
      ++i;
      Itoa(a / p, p, s);
      s[n - i--] = DIG[a % p];
   }
   else
      s[n = i] = '\0';
}
 
int main(){
    long long n, k;
   char s[1024];
   cin >> n >>  s >> k;
   Itoa(Atoi(s, n), k, s);
   cout << s << endl;
   return 0;
}
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
17.10.2016, 09:54     Универсальный конвертер систем счисления #32
Цитата Сообщение от Deniska07 Посмотреть сообщение
А ваша программа справится с 16 ричной системой?
- моя справится с ЛЮБОЙ системой (от двоичной до 36-ричной). Кстати, по программной логике твой ответ сильно похож на мой...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.10.2016, 12:05     Универсальный конвертер систем счисления #33

Не по теме:

Самое интересное, что в ссылке из поста #5 уже была готовая программа. В итоге в теме появились ещё две программы, которые устроены аналогичным образом. Воистину анекдот про "чукча не читатель, чукча писатель" является очень акутальным. Такой вариант всегда является полезным для самообразования, но Castail, насколько я знаю, и так это место хорошо понимает, а Deniska07, судя по всему, содрал откуда-то готовое решение. Т.е. в конечном итоге вроде бы как нет ни одного человека, который до прочтения темы не понимал этот вопрос, а после прочтения стал понимать



Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
моя справится с ЛЮБОЙ системой (от двоичной до 36-ричной)
Ограничение в 36-ричной системе является вовсе не ограничением алгоритма, а ограничением того, что не понятно, как записывать в системах с основанием 37 и выше. А так у этих алгоритмов нет принципиальных ограничений на основания системы счисления
minore
17.10.2016, 12:32
  #34

Не по теме:


а все потому, что помогая новичкам демонстрируем работу алгоритма кодом (что изначально не верно) плюс к тому не принято комментировать код, вот и получается, что максимальная польза - содрать решение.

Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
17.10.2016, 13:05     Универсальный конвертер систем счисления #35
Evg, а разве я говорил об ограничениях алгоритма? Заглянул в Ваш блог, но "не понял, в чем пафос". Все довольно очевидно.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.10.2016, 19:13     Универсальный конвертер систем счисления #36

Не по теме:

Цитата Сообщение от minore Посмотреть сообщение
а все потому, что помогая новичкам демонстрируем работу алгоритма кодом
Нет, не поэтому. Как только в коде видишь хоть какое упоминание про 10-чную систему (для промежуточного значения), то смело можно утверждать, что афтор программы в теме не разбирается



Цитата Сообщение от Catstail Посмотреть сообщение
Evg, а разве я говорил об ограничениях алгоритма?
В посте #32 была мысль. Незнающие люди могли бы её понять именно так, как я написал. А потому в догонку к твоей мысли написал пояснение
minore
207 / 81 / 18
Регистрация: 05.02.2015
Сообщений: 467
17.10.2016, 20:16     Универсальный конвертер систем счисления #37
А где можно посмотреть на сам алгоритм, обсуждаемый и приводимый здесь? не спорю, всегда лучше переводить 1 раз, чем 2, но где документация? как можно понять, что размещенные коды работают правильно?
в теме может я и не разбираюсь, но я могу показать, где можно прочитать то, про что я говорю: https://ru.wikipedia.org/wiki/%D0%9F...BD%D0%B8%D1%8F
пункты 6.1 и 6.2.
Dsasdf
Заблокирован
17.10.2016, 21:11     Универсальный конвертер систем счисления #38
C++
1
2
3
4
5
6
7
8
9
string converter(int from, int to, string value) {
    int dValue = 0;
    string result;
    for (int i = value.length() - 1; i >= 0; i--)
        dValue += ((value[i] >= '0' && value[i] <= '9') ? value[i] - '0' : value[i] - 'A' + 10) * std::pow(from, value.length() - i - 1);
    do result += (dValue % to >= 10) ? dValue % to + 'A' - 10 : dValue % to + '0'; while (dValue /= to);
    std::reverse(result.begin(), result.end());
    return result;
};
Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Как только в коде видишь хоть какое упоминание про 10-чную систему (для промежуточного значения), то смело можно утверждать, что афтор программы в теме не разбирается
Та ты шо. А ну-ка напиши мне без перевода в десятичную систему счисления.
.....
В принципе можно, но код вырастет.

Не по теме:

Добавлено через 1 минуту

Цитата Сообщение от Deniska07 Посмотреть сообщение
0, 1, 2, ..., 9, A, B, C, ..., Z
Цитата Сообщение от Evg Посмотреть сообщение
1a8a
Не замечаешь ничего? А и а - еще бы косяков быть не должно

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2016, 21:34     Универсальный конвертер систем счисления
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.10.2016, 21:34     Универсальный конвертер систем счисления #39
Цитата Сообщение от Dsasdf Посмотреть сообщение
А ну-ка напиши мне без перевода в десятичную систему счисления
Собственно, что и требовалось доказать. Тебе тоже кажется, что ты делаешь перевод в десятичную систему (видимо, поэтому переменная названа dValue). Большинство попросту не видит разницы между понятием "число" и "запись числа", а наличие комментариев или чего-то ещё, касаемое десятичной системы, является индикатором этого непонимания
Yandex
Объявления
17.10.2016, 21:34     Универсальный конвертер систем счисления
Ответ Создать тему
Опции темы

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