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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 111, средняя оценка - 4.69
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
02.01.2012, 13:23     Перевод в 9-чную систему счисления #1
есть задача, что бы решить ее до конца мне надо сделать перевод из 10-тичной(можно любой другой) в девятиричную систему счисления
я бы это сделал сам, если бы не странность системы.
В задание звучит так: Рассмотрим девятеричную позиционную систему счисления с цифрами { B, A, 0, 1, 2, 3, 4, 5, 6 }, где цифра A имеет значение -1, а цифра B – значение -2.

подскажите как сделать этот перевод(функцию или алгоритм)

Добавлено через 49 минут
up
есть идеи?

 Комментарий модератора 
По просьбе одного из авторов, в связи с тем, что тема растянулась, ссылки на решения в этой теме:
Решение 1
Решение 2
Решение 3
Решение 4
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
14.01.2012, 22:49     Перевод в 9-чную систему счисления #81
я чей то запутался с отрицательными
и вдруг задумался а как мы переводим в двоичный код отрицательные значения
про инвертирование модуля и добавлении 1
и про вычитания из 0 модуля
сам знаю
здесь эти подходы не проходят
алгоритмически вроде нащупал но вывести закономерность не могу
единственно что нашел
значение младшего разряда
надо вычитать из основания(9) значение до тех пор пока разность не уложится в диапазон
-3 = 9-3 =6 (число A6)
-11 9-11=-1(A) (число AA)

-15 9-15= -6 9-6= 3 (число B3)

но вот где A где B не могу поймать
и когда оно из двузначного станет трех(четырех) значным


Добавлено через 3 минуты
один раз вычитаешь A
два раза B
три раза AA
четыре раза AB
но как перевести на формальный язык

Добавлено через 26 минут
кажись дотумкал
прибавляем к числу 3 (2 смещение и 0)
и делим его на 9
полученный результат если меньше -2 то еще раз делим на 2(чисто интуитивно типа смешение)
где 0 там A
1 --> B
а остаток вычитаем из 6 (граничное число)
например
-3 -3+3=0 0/9=0(A) остаток 0 (6-0=6) A6
-12 -13+3=-10 -10/9=1(B) остаток 1(6-1=5) B5

-24 -24+3= -21 -21/9=2 остаток 3 (6-3=3) 2/2 =1 остаток 0=A 1/2=0 =A AA3
в общем опять заплюхался
проверьте и поправте
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,664
14.01.2012, 23:19     Перевод в 9-чную систему счисления #82
Цитата Сообщение от ValeryS Посмотреть сообщение
алгоритмически вроде нащупал но вывести закономерность не могу
Вот здесь я более ясно написал код функции int_to_my_9ary, из которого понятен алгоритм перевода:
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/////////////////////////////////////////////////////////////////////////////////////////
//Рассмотрим девятеричную позиционную систему счисления 
//с цифрами { B, A, 0, 1, 2, 3, 4, 5, 6 }, 
//где цифра A имеет значение -1, а цифра B – значение -2.
//Выполните
//следующие операции и представьте результат в этой же самой системе счисления:
//24+5A     = 1B3
//B5+61     = 46
//52*A6     = B23
//312+41B   = 1B20
//A1A*B2B   = 15552
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <cctype>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
const int   BASE_RADIX      = 9;
const int   A_DIG_VAL       = -1;
const int   B_DIG_VAL       = -2;
const int   MIN_DIG_VAL     = B_DIG_VAL;
const int   MAX_DIG_VAL     = MIN_DIG_VAL + BASE_RADIX - 1;
/////////////////////////////////////////////////////////////////////////////////////////
int  my_9ary_to_int(const T_str&  expr)
{
    int  int_res = 0;
 
    for(
        T_str::const_iterator  symb_it = expr.begin();
        symb_it != expr.end();
        ++symb_it
       )      
    {
        int_res *= BASE_RADIX;
 
        switch(*symb_it)
        {
        case 'A':
            int_res += A_DIG_VAL;
            break;
 
        case 'B':
            int_res += B_DIG_VAL;
            break;
 
        default:
            int_res += *symb_it - '0';
        }        
    }
    return  int_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  int_to_my_9ary(int  int_val)
{    
    T_str   res_str;
    if(int_val == 0)
    {
        res_str = "0";
    }
 
    bool    is_negative     = int_val < 0;
    int     abs_int_val     = abs(int_val);
 
    while(abs_int_val)
    {        
        int     abs_int_last_dig    = abs_int_val % BASE_RADIX;
        int     int_last_dig        = is_negative ? -abs_int_last_dig : abs_int_last_dig;
 
        abs_int_val /= BASE_RADIX;
 
        while(int_last_dig > MAX_DIG_VAL)
        {
            int_last_dig -= BASE_RADIX;
            is_negative
                ? --abs_int_val
                : ++abs_int_val;            
        }
 
        while(int_last_dig < MIN_DIG_VAL)
        {
            int_last_dig += BASE_RADIX;
            is_negative
                ? ++abs_int_val
                : --abs_int_val;
        }
        
        char  char_last_dig = 0;
 
        switch(int_last_dig)
        {
        case A_DIG_VAL:
            char_last_dig = 'A';
            break;
 
        case B_DIG_VAL:
            char_last_dig = 'B';
            break;
 
        default:
            char_last_dig = '0' + int_last_dig;
            break;
        }
        res_str.push_back(char_last_dig);
    }
    std::reverse
        (
            res_str.begin(),
            res_str.end()
        );
 
    return  res_str;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_str  calc_expr(const T_str&  expr)
{
    T_str::size_type    op_pos  =   expr.find_first_of("+*");
 
    T_str   L                   =   expr.substr
                                        (
                                            0,
                                            op_pos
                                        ); 
 
    T_str   R       =   expr.substr(op_pos + 1); 
 
    int     L_int   =   my_9ary_to_int(L);
    int     R_int   =   my_9ary_to_int(R);
 
    int     int_res     =   0;
    switch( expr[op_pos] )
    {
    case '+':
        int_res = L_int + R_int;
        break;
 
    case '*':
        int_res = L_int * R_int;
        break;
    }
 
    return  int_to_my_9ary(int_res); 
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Ведите без пробелов пример сложения или умножения чисел"
              << std::endl
              << "в девятеричной системе счисления с цифрами { B, A, 0, 1, 2, 3, 4, 5, 6 }, "
              << std::endl
              << "где цифра A имеет значение -1, а цифра B – значение -2:";              
 
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << "-> ";
 
        T_str  expr;
        std::cin >> expr;
        std::cout << calc_expr(expr)
                  << std::endl;
    }
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.01.2012, 00:01     Перевод в 9-чную систему счисления #83
Я, грешник, как-то написал прогу, которая выводит на экран любое число десятичое в любой системе исчисления. Но цифры этого числа плучались днамически, что называется. На то, чтобы сохранять их в массиве символов, то ли ума, то ли терпения не хватило.

А вот код не мой крутой. Переводит любое число в любую систему
Вложения
Тип файла: rar conv_w.rar (2.6 Кб, 16 просмотров)
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
15.01.2012, 00:08     Перевод в 9-чную систему счисления #84
Благодарствую
привел мысли в порядок (а иначе уснуть не могу )

действительно нужен цикл

и так для перевода положительных чисел
точнее для чисел больше или равно -2(нижний предел)

добавить к числу 2 (смешение)
разделить на основу системы счисления(9)
остаток -2 это младший разряд
если результат больше 6 (вехний предел)
повторить
иначе результат старший разряд

для отрицательных (точнее для чисел меньше -2 нижний предел)
прибавляем к числу 3 (2 смещение и 0)
разделить на основу системы счисления(9)
остаток вычитаем из 6 (вехний предел ) это младший разряд
результат уменьшаем на 1
если результат меньше -2(B нижний предел)
повторить
иначе результат старший разряд

хочется сделать универсальную функцию но не знаю возможно ли
проверте

Mr.X,
программа это хорошо но я по крайней мере пока не опишу словами не понимаю полной сути проблемы
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,664
15.01.2012, 01:27     Перевод в 9-чную систему счисления #85
Цитата Сообщение от ValeryS Посмотреть сообщение
Mr.X,
программа это хорошо но я по крайней мере пока не опишу словами не понимаю полной сути проблемы
Если вы пытаетесь сформулировать алгоритм перевода числа n из десятичной системы счисления в заданную необычную девятеричную, то он таков:
1. Ввести n.
2. Если n = 0, то результирующей строке присвоить «0».
3. пока n не равно нулю:
3.1. получить остаток r от деления n на 9 (для отрицательного n значение должно быть отрицательное)
3.2. разделить n на 9.
3.3. пока r меньше минимальной цифры (в нашем случае минус 2) прибавить к r число 9 и вычесть единицу из n.
3.4. пока r больше максимальной цифры (в нашем случае 6) отнять от r число 9 и прибавить единицу к n.
3.5. добавить в начало результирующей строки цифру, соответствующую значению r.
4. Вывести результирующую строку.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
15.01.2012, 03:22     Перевод в 9-чную систему счисления #86
diagon,
посмотрел на твои функции
и мои наметки
я про
Цитата Сообщение от diagon Посмотреть сообщение
Нужно так подобрать функцию, что для данных вызовов она возвращала то, что написано в комментариях.
Цитата Сообщение от alkagolik Посмотреть сообщение
короче у тебя неполная функция это означает что недостающие комбинации дополняешь в результате единицу
извините не согласен дополняешь х(безразличное состояние) потом можешь объединять хоть с 0 хоть с 1 ( но только с одним из них)
да и функция вроде полная все комбинации описаны
для функции foo(x4,x3,x2,x1)
карта карно выглядит вот так

ActionScript 3
1
2
3
4
5
6
          x4x3
            00    01     11     10   
 x2x1   00  0      0      1      1  
        01  1      0      0      1
        11  1      0      0      0
        10  1      1      1      1
соответственно объединяя 0 получим 3 блока

C++
1
return !(((!x1)&(!x2)&(!x4))  | ( x1 & x3) | ( x1 & x2 & x4));
объединяя 1 получим 4 блока
C++
1
 return ((!x1&x2) | (x1 & !x3 & !x4) | ( !x1 & !x2 & x4) | (!x2 & !x3 & x4));
alkagolik проверь вроде не напутал
ты тут писал про кучу умных методов ,может я ими и пользуюсь, не знаю учился давно, а карты Карно в подкорке сидят

diagon, любую можешь вставлять результат идентичный (должен быть)
как инверсию ! поменять на xor ^ знаю (x1^1)
а как | & не знаю и возможно ли это
там точно в задании написано что логическими операндами пользоваться нельзя?
иначе только табличный метод
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
15.01.2012, 04:13     Перевод в 9-чную систему счисления #87
Цитата Сообщение от ValeryS Посмотреть сообщение
я чей то запутался с отрицательными
не удивительно. Решение задачи нельзя строить на переводе в другую сс, я категорически настаиваю на том что все операции должны быть только в исходной сс. Как, это уже другой вопрос.
Цитата Сообщение от ValeryS Посмотреть сообщение
извините не согласен
а если дочитать предложение до конца, то очень даже согласишься, потому что написано все то же самое что и у тебя. Вот только я просчитался в том что она действительно полная, тем проще.
Цитата Сообщение от ValeryS Посмотреть сообщение
alkagolik проверь вроде не напутал
и еще много чего и все это для поиска наиболее минимальной функции (максимально быстрого алгоритма работы устройства), это если делать "как положено". Оба варианта неверные. Первый изначально потому что МДНФ строится на конъюнкции дизъюнкций, а у тебя дизъюнкция конъюнкций + ты единицу представляешь как "х", а надо как "не х" короче в корне, а во втором варианте неправильно, ну просто ошибки.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,664
15.01.2012, 08:10     Перевод в 9-чную систему счисления #88
Цитата Сообщение от alkagolik Посмотреть сообщение
Решение задачи нельзя строить на переводе в другую сс, я категорически настаиваю на том что все операции должны быть только в исходной сс. Как, это уже другой вопрос.
Но для этого нужно вначале построить таблицы сложения и умножения, в которых нужно будет вычислить 2 * (n - 1)^2 чисел, производя при этом 2 * (n - 1)^2 "переводов в другую сс". Если n невелико, то это можно сделать и вручную, а если велико, то пригодится программка, осуществляющая этот перевод, сложность которой от n не зависит. Ну, а если она будет написана, то и отпадет надобность в составлении вышеупомянутых таблиц и в выполнении всех операций "только в исходной сс".
В общем, ваш путь более сложный и предполагает выполнение вручную того, с чем вполне компьютер может справиться.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.01.2012, 09:15     Перевод в 9-чную систему счисления #89
Цитата Сообщение от ValeryS Посмотреть сообщение
diagon, любую можешь вставлять результат идентичный (должен быть)
Забыл добавить - формула должна быть минимальной по количеству символов.
И на С я ее для удобства перевел, вообще там формулу надо написать математически(т.е. AB означает умножение).
P.S. в базис Жегалкина я ее перевел, получил работающую формулу, но она какая-то раздутая получилась. И нужно ее минимизировать.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
15.01.2012, 14:30     Перевод в 9-чную систему счисления #90
Цитата Сообщение от diagon Посмотреть сообщение
P.S. в базис Жегалкина я ее перевел, получил работающую формулу, но она какая-то раздутая получилась. И нужно ее минимизировать.
Заметим, что преимущество алгебры Жегалкина (по сравнению с другими алгебрами) состоит в арифметизации логики, что позволяет выполнять преобразования булевых функций довольно просто. Ее недостатком по сравнению с булевой алгеброй является громоздкость формул.
Цитата Сообщение от Mr.X Посмотреть сообщение
Но для этого нужно вначале построить таблицы сложения
вот таблица сложения кстати там вычислено ровно 17 элементов, остальное копипаст. Это не единственный вариант. Есть вариант с кодированием и битовыми операциями, можно как я уже говорил смоделировать троичную логику. Короче твердо убежден, и вполне допускаю ошибочность своего видения, в том что десятичное преобразование и вычисление только "грубит" алгоритм.
Цитата Сообщение от Mr.X Посмотреть сообщение
В общем, ваш путь более сложный и предполагает выполнение вручную того, с чем вполне компьютер может справиться.
зато предполагает наименьшее количество операций. Это неоспоримый плюс.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,664
15.01.2012, 14:55     Перевод в 9-чную систему счисления #91
Цитата Сообщение от alkagolik Посмотреть сообщение
Есть вариант с кодированием и битовыми операциями, можно как я уже говорил смоделировать троичную логику.
Было бы интересно увидеть программку.

Добавлено через 6 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
зато предполагает наименьшее количество операций. Это неоспоримый плюс.
Согласно современным концепциям более понятная программа предпочтительнее менее понятной, но работающей быстрее или использующей меньше памяти.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
15.01.2012, 19:22     Перевод в 9-чную систему счисления #92
Цитата Сообщение от Mr.X Посмотреть сообщение
Было бы интересно увидеть программку.

Не по теме:

может еще и увидим...


Цитата Сообщение от Mr.X Посмотреть сообщение
Согласно современным концепциям

Не по теме:

концепциям чего?

Hi4ko
74 / 74 / 4
Регистрация: 21.10.2010
Сообщений: 376
16.01.2012, 16:16     Перевод в 9-чную систему счисления #93
почему этого человека до сих пор не забанили?
идёт заочная олимпиада по этим задачам, а вы пишете решения. Вообще уже ><

Добавлено через 4 минуты
http://lomonosov.msu.ru/sites/defaul...atics_2012.PDF

идиотизм полный, по-другому это никак не назовёшь

на codeforces бы за такое вообще перестали бы обращать внимание на создателя топика
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.01.2012, 16:23     Перевод в 9-чную систему счисления #94
Hi4ko, просто никто сразу не указал что это за олипиады и откуда они. А в принципе какая разница, на первом же курсе преподаватели увидят ху из ху. Кстати вы бы проявили инициативу к руководителям олимпиады, они свяжутся с администрацией форума ну и все вытекающие.
Hi4ko
74 / 74 / 4
Регистрация: 21.10.2010
Сообщений: 376
16.01.2012, 16:29     Перевод в 9-чную систему счисления #95
Цитата Сообщение от alkagolik Посмотреть сообщение
Hi4ko, просто никто сразу не указал что это за олипиады и откуда они. А в принципе какая разница, на первом же курсе преподаватели увидят ху из ху. Кстати вы бы проявили инициативу к руководителям олимпиады, они свяжутся с администрацией форума ну и все вытекающие.
я на стукача похож?
Пусть на его совести останется, в этой олимпиаде у меня всё равно приоритет на физике, а информатику для себя пишу.
Просто человек уже 2 задачу спрашивает, написав, при этом, полностью условие на форуме.
Причём абсолютно безнаказанно.
На любом другом портале не стали бы расписывать ОЛИМПИАДНУЮ задачу, тем более, на 100 постов, не зная её источника
А так человек, благодаря вам, займёт место другого, более достойного, на заключительном этапе.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.01.2012, 16:43     Перевод в 9-чную систему счисления #96
Цитата Сообщение от Hi4ko Посмотреть сообщение
я на стукача похож?
неконструктивно. Если уже и ботать феню, то ответ держать каждый должен и не важно кто раскачает качели. Когда все на одном берегу спалить крысу не западло.
Цитата Сообщение от Hi4ko Посмотреть сообщение
А так человек, благодаря вам, займёт место другого, более достойного, на заключительном этапе.
Цитата Сообщение от alkagolik Посмотреть сообщение
на первом же курсе преподаватели увидят ху из ху.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.01.2012, 16:53     Перевод в 9-чную систему счисления #97
Hi4ko, пали не пали, это без толку. Правильнее не решать, но тут уж такой форум, ничё не поделаешь. Хотя с другой стороны, россыпь задач. А с третьей стороны- даже люди толком не оформляют задания. Короче, предлагаю тех, кто не оформляет задания должным образом банить беспощадно.
Hi4ko
74 / 74 / 4
Регистрация: 21.10.2010
Сообщений: 376
16.01.2012, 17:00     Перевод в 9-чную систему счисления #98
Цитата Сообщение от kravam Посмотреть сообщение
Hi4ko, пали не пали, это без толку. Правильнее не решать, но тут уж такой форум, ничё не поделаешь. Хотя с другой стороны, россыпь задач. А с третьей стороны- даже люди толком не оформляют задания. Короче, предлагаю тех, кто не оформляет задания должным образом банить беспощадно.
Я люблю этот форум за отзывчивых здесь людей)
Но иногда она во вред идёт. Если видно, что задача со спортивного программирования(или просто олимпиады школьников), то можно просто источник попросить и проблема решится. На кодфорсес просто куча моих ровестников - школьников спрашивает решения задач заочных контестов. Но там уже начали их "банить люто, бешено"
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.01.2012, 17:11     Перевод в 9-чную систему счисления #99
Цитата Сообщение от kravam Посмотреть сообщение
Короче, предлагаю тех, кто не оформляет задания должным образом банить беспощадно.
лучше не банить, а переносить во фриланс.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2012, 18:34     Перевод в 9-чную систему счисления
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.01.2012, 18:34     Перевод в 9-чную систему счисления #100
Цитата Сообщение от Hi4ko Посмотреть сообщение
Если видно, что задача со спортивного программирования(или просто олимпиады школьников),
это по каким критериям должно быть это видно ? Я вообще был уверен что это преподаватель над студентами перед сессией издевается.
Yandex
Объявления
16.01.2012, 18:34     Перевод в 9-чную систему счисления
Ответ Создать тему
Опции темы

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