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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 111, средняя оценка - 4.69
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 642
#1

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

02.01.2012, 13:23. Просмотров 14616. Ответов 122
Метки нет (Все метки)

есть задача, что бы решить ее до конца мне надо сделать перевод из 10-тичной(можно любой другой) в девятиричную систему счисления
я бы это сделал сам, если бы не странность системы.
В задание звучит так: Рассмотрим девятеричную позиционную систему счисления с цифрами { B, A, 0, 1, 2, 3, 4, 5, 6 }, где цифра A имеет значение -1, а цифра B – значение -2.

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

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

 Комментарий модератора 
По просьбе одного из авторов, в связи с тем, что тема растянулась, ссылки на решения в этой теме:
Решение 1
Решение 2
Решение 3
Решение 4
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 13:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод в 9-чную систему счисления (C++):

"Перевести натуральное число из 8-ричной в 10-чную систему счисления" - C++
Добрый вечер) Друзья помогите пожалуйста составить программку) Условие задачи: Целое длинное число A задается в диалоговом режиме. ...

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

Перевод строки из 2-ной системы счисления в 8-ную систему счисления - C++
помогите пожалуйста как сделать перевод строки из 2 системы счисления на 8 систему счисления через массив ?

Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно - C++
Нужно две программы, одна реализует перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки, а другая...

Перевод чисел из 16 системы счисления в 2 систему счисления - C++
Помогите составить программу для перевод чисел из 16 с/c в 2 c/c при условии,что программ может переводить и дробные числа.

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

122
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,235
14.01.2012, 15:16 #76
greeezz,
и что тебя улыбнуло ???
0
greeezz
14.01.2012, 20:45
  #77

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
greeezz,
и что тебя улыбнуло ???
я просто указал на опечатку.. чтобы в дальнейшем было меньше вопросов что это такое у кого-то еще. а смайл это просто настроение хорошее. так что ровным счетом ничего.

1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,235
14.01.2012, 21:09 #78
Цитата Сообщение от greeezz Посмотреть сообщение
я просто указал на опечатку..
ну спасибо просто расшифровал бы
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.01.2012, 21:43 #79
Цитата Сообщение от greeezz Посмотреть сообщение
я просто указал на опечатку
А разве основание не 9?
Просто вы ее синим цветом выделили, я даже засомневался в правильности своего решения.
0
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.01.2012, 21:46 #80
diagon, у ValeryS написано
Цитата Сообщение от ValeryS Посмотреть сообщение
19/2 =2 остаток 1
ну я и написал что там 9тка должна быть.
1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,235
14.01.2012, 22:49 #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
в общем опять заплюхался
проверьте и поправте
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2012, 23:19 #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;
    }
}
2
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
15.01.2012, 00:01 #83
Я, грешник, как-то написал прогу, которая выводит на экран любое число десятичое в любой системе исчисления. Но цифры этого числа плучались днамически, что называется. На то, чтобы сохранять их в массиве символов, то ли ума, то ли терпения не хватило.

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

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

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

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

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

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

Mr.X,
программа это хорошо но я по крайней мере пока не опишу словами не понимаю полной сути проблемы
1
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
15.01.2012, 01:27 #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. Вывести результирующую строку.
2
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,235
15.01.2012, 03:22 #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)
а как | & не знаю и возможно ли это
там точно в задании написано что логическими операндами пользоваться нельзя?
иначе только табличный метод
0
alkagolik
Заблокирован
15.01.2012, 04:13 #87
Цитата Сообщение от ValeryS Посмотреть сообщение
я чей то запутался с отрицательными
не удивительно. Решение задачи нельзя строить на переводе в другую сс, я категорически настаиваю на том что все операции должны быть только в исходной сс. Как, это уже другой вопрос.
Цитата Сообщение от ValeryS Посмотреть сообщение
извините не согласен
а если дочитать предложение до конца, то очень даже согласишься, потому что написано все то же самое что и у тебя. Вот только я просчитался в том что она действительно полная, тем проще.
Цитата Сообщение от ValeryS Посмотреть сообщение
alkagolik проверь вроде не напутал
и еще много чего и все это для поиска наиболее минимальной функции (максимально быстрого алгоритма работы устройства), это если делать "как положено". Оба варианта неверные. Первый изначально потому что МДНФ строится на конъюнкции дизъюнкций, а у тебя дизъюнкция конъюнкций + ты единицу представляешь как "х", а надо как "не х" короче в корне, а во втором варианте неправильно, ну просто ошибки.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
15.01.2012, 08:10 #88
Цитата Сообщение от alkagolik Посмотреть сообщение
Решение задачи нельзя строить на переводе в другую сс, я категорически настаиваю на том что все операции должны быть только в исходной сс. Как, это уже другой вопрос.
Но для этого нужно вначале построить таблицы сложения и умножения, в которых нужно будет вычислить 2 * (n - 1)^2 чисел, производя при этом 2 * (n - 1)^2 "переводов в другую сс". Если n невелико, то это можно сделать и вручную, а если велико, то пригодится программка, осуществляющая этот перевод, сложность которой от n не зависит. Ну, а если она будет написана, то и отпадет надобность в составлении вышеупомянутых таблиц и в выполнении всех операций "только в исходной сс".
В общем, ваш путь более сложный и предполагает выполнение вручную того, с чем вполне компьютер может справиться.
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.01.2012, 09:15 #89
Цитата Сообщение от ValeryS Посмотреть сообщение
diagon, любую можешь вставлять результат идентичный (должен быть)
Забыл добавить - формула должна быть минимальной по количеству символов.
И на С я ее для удобства перевел, вообще там формулу надо написать математически(т.е. AB означает умножение).
P.S. в базис Жегалкина я ее перевел, получил работающую формулу, но она какая-то раздутая получилась. И нужно ее минимизировать.
0
alkagolik
Заблокирован
15.01.2012, 14:30 #90
Цитата Сообщение от diagon Посмотреть сообщение
P.S. в базис Жегалкина я ее перевел, получил работающую формулу, но она какая-то раздутая получилась. И нужно ее минимизировать.
Заметим, что преимущество алгебры Жегалкина (по сравнению с другими алгебрами) состоит в арифметизации логики, что позволяет выполнять преобразования булевых функций довольно просто. Ее недостатком по сравнению с булевой алгеброй является громоздкость формул.
Цитата Сообщение от Mr.X Посмотреть сообщение
Но для этого нужно вначале построить таблицы сложения
вот таблица сложения кстати там вычислено ровно 17 элементов, остальное копипаст. Это не единственный вариант. Есть вариант с кодированием и битовыми операциями, можно как я уже говорил смоделировать троичную логику. Короче твердо убежден, и вполне допускаю ошибочность своего видения, в том что десятичное преобразование и вычисление только "грубит" алгоритм.
Цитата Сообщение от Mr.X Посмотреть сообщение
В общем, ваш путь более сложный и предполагает выполнение вручную того, с чем вполне компьютер может справиться.
зато предполагает наименьшее количество операций. Это неоспоримый плюс.
0
15.01.2012, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2012, 14:30
Привет! Вот еще темы с ответами:

Перевод из десятичной в N систему счисления - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main () { int osn2, chislo,z=0,i=0,a,b; ...

Перевод в двоичную систему счисления - C++
Пожалуйста, помогите с задачкой. Даны два числа a, b их нужно сперва перевести в двоичную систему счисления (сами они из десятичной), а...

Перевод в 12-ричную систему счисления - C++
помогите , подскажите как правильно перевести

Перевод в заданную систему счисления - C++
Дано задание: Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число...


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

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

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