Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/88: Рейтинг темы: голосов - 88, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8

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

16.10.2016, 08:10. Показов 18020. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2016, 08:10
Ответы с готовыми решениями:

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

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

Конвертер систем счисления в С++
Помогите, пожалуйста, написать конвертер систем счисления на С++. Он должен переводить числа из 8-ричной СС в 16-ричную с 4 разрядами....

38
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
16.10.2016, 14:42
Студворк — интернет-сервис помощи студентам
"Истинное значение - это которое хранится в переменной типа int. В памяти компьютера оно хранится в двоичной системе, выводится на монитор по умолчанию в десятичной, но можно вывести в одной из нескольких других по желанию."
но ведь что нам тольу, что числа в компьютере в двоичном виде хранятся, если нам удобно в десятичной считать? да, и ваше предложение-то какое? вот уже и код выложили по тому же алгоритму, через десятичную систему.
0
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
16.10.2016, 14:44
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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2016, 14:57
Цитата Сообщение от 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
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
16.10.2016, 15:09
просто из комментариев, которыми сопроводил свой код автор
цитата:
C++
1
2
// Выполняем перевод из любой системы исчисления base_in в систему исчисления с основой 10
// путем деления как это уже обговаривалось в предыдущем посте.
"
соответствуют ли комментарии коду не вникал.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2016, 15:14
Цитата Сообщение от minore Посмотреть сообщение
просто из комментариев, которыми сопроводил свой код автор
Это вы сейчас с кем разговаривали? Если со мной, то вы меня с каким-то другим "автором" перепутали.
И научитесь уже цитировать сообщения, на которые отвечаете.
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
16.10.2016, 15:24
я имею ввиду того автора, который код выложил ) вы вроде как в этой теме никаких наработок не выкладывали, ну или я пропустил.

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

Добавлено через 24 минуты
Цитата Сообщение от Deniska07 Посмотреть сообщение
Invader0x7F
А почему у вас в коде везде написано 11?
if (base_in < 11 && base_out < 11) здесь например
объясните пожалуйста
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
16.10.2016, 18:23
хотели алгоритм, получайте на примере: есть число 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
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
16.10.2016, 19:44
Что-то не нравятся мне эти решения... Мне представляется, что универсальный конвертор должен брать строку и два целых: исходное основание и результирующее основание, а возвращать тоже строку. При этом 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
0 / 0 / 0
Регистрация: 16.10.2016
Сообщений: 8
17.10.2016, 09:41  [ТС]
Цитата Сообщение от 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;
}
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
17.10.2016, 09:54
Цитата Сообщение от Deniska07 Посмотреть сообщение
А ваша программа справится с 16 ричной системой?
- моя справится с ЛЮБОЙ системой (от двоичной до 36-ричной). Кстати, по программной логике твой ответ сильно похож на мой...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.10.2016, 12:05

Не по теме:

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



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

Не по теме:


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

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
17.10.2016, 13:05
Evg, а разве я говорил об ограничениях алгоритма? Заглянул в Ваш блог, но "не понял, в чем пафос". Все довольно очевидно.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.10.2016, 19:13

Не по теме:

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



Цитата Сообщение от Catstail Посмотреть сообщение
Evg, а разве я говорил об ограничениях алгоритма?
В посте #32 была мысль. Незнающие люди могли бы её понять именно так, как я написал. А потому в догонку к твоей мысли написал пояснение
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
17.10.2016, 20:16
А где можно посмотреть на сам алгоритм, обсуждаемый и приводимый здесь? не спорю, всегда лучше переводить 1 раз, чем 2, но где документация? как можно понять, что размещенные коды работают правильно?
в теме может я и не разбираюсь, но я могу показать, где можно прочитать то, про что я говорю: https://ru.wikipedia.org/wiki/... 0%B8%D1%8F
пункты 6.1 и 6.2.
0
Заблокирован
17.10.2016, 21:11
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
Не замечаешь ничего? А и а - еще бы косяков быть не должно :D

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.10.2016, 21:34
Цитата Сообщение от Dsasdf Посмотреть сообщение
А ну-ка напиши мне без перевода в десятичную систему счисления
Собственно, что и требовалось доказать. Тебе тоже кажется, что ты делаешь перевод в десятичную систему (видимо, поэтому переменная названа dValue). Большинство попросту не видит разницы между понятием "число" и "запись числа", а наличие комментариев или чего-то ещё, касаемое десятичной системы, является индикатором этого непонимания
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2016, 21:34

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru