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

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

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

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

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

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

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

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

 Комментарий модератора 
По просьбе одного из авторов, в связи с тем, что тема растянулась, ссылки на решения в этой теме:
Решение 1
Решение 2
Решение 3
Решение 4
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++
как делать?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17625 / 5849 / 376
Регистрация: 30.03.2009
Сообщений: 16,132
Записей в блоге: 26
05.01.2012, 20:00 #46
Цитата Сообщение от thick_int Посмотреть сообщение
Например, любое число вида 2^n, где n - число четно можно представить и в виде 2^n и в виде B^n
В степень взводится не двойка, а девятка, как показатель системы счисления (radix). А на 2 или на B - идёт умножение. И никакой неоднозначности с этой точки зрения нет
alkagolik
Заблокирован
05.01.2012, 20:04 #47
Evg, вот я к этому и вел с самого начала. И даже к тому что 9 уровней не надо. Для цифры хватит 3 уровня и 2 разряда.
Evg
Эксперт CАвтор FAQ
17625 / 5849 / 376
Регистрация: 30.03.2009
Сообщений: 16,132
Записей в блоге: 26
05.01.2012, 20:07 #48
Цитата Сообщение от alkagolik Посмотреть сообщение
И даже к тому что 9 уровней не надо. Для цифры хватит 3 уровня и 2 разряда
Логически это одно и то же. Как такового знака в регистрах в любом случае не будет
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
06.01.2012, 11:07  [ТС] #49
Цитата Сообщение от greeezz Посмотреть сообщение
Если бы автор темы предложил бы нам к просмотру вариант решения задачи от преподавателя.
скорее всего варианта решения не будет выложенно
если все же будет, то после января, тогда я обязательно напишу сюда
Evg
Эксперт CАвтор FAQ
17625 / 5849 / 376
Регистрация: 30.03.2009
Сообщений: 16,132
Записей в блоге: 26
06.01.2012, 14:16 #50
Цитата Сообщение от Evg Посмотреть сообщение
Как ты делаешь сложение столбиком в десятичной системе? Грубо говоря, сначала складываешь два правых разряда. Если получается двузначное число, то старший разряд (единицу) переносишь в следующий разряд. Тут, вроде бы как, будет то же самое. Берёшь разряды в строковой форме, переводишь их в число, делаешь сложение в виде чисел, результат переводишь в строковую форму. Если строка будет состоять из одного символа, то сложение разрядов будет без переноса, если из двух символов - то с переносом. Причём старший символ вроде бы как только единицей может быть
В итоге получается, что сложение столбиком делается ровно так, как я и описывал. За исключением того, что в левый разряд помимо единицы может ещё и A переноситься. Т.е. по большому счёту сложение столбиком делается по всем тем же правилам, что и в привычных системах счисления (только в обычных системах переноситься может только единица, а тут ещё и минус единица)
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.01.2012, 17:22 #51
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
есть задача, что бы решить ее до конца мне надо сделать перевод из 10-тичной(можно любой другой) в девятиричную систему счисления
я бы это сделал сам, если бы не странность системы.
В задание звучит так: Рассмотрим девятеричную позиционную систему счисления с цифрами { B, A, 0, 1, 2, 3, 4, 5, 6 }, где цифра A имеет значение -1, а цифра B – значение -2.

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

есть идеи?
Давайте вспомним математику. Пусть q - некоторое натуральное целое число, причем q>1. Тогда любое натуральное число a можно представить в виде суммы
http://www.cyberforum.ru/cgi-bin/latex.cgi?a = a_t q^t + ... + a_1q+a_0, где
http://www.cyberforum.ru/cgi-bin/latex.cgi?0 \leq a_t, ...,a_1, a_0 <q. Причем это представление единственно. Эти коэффициенты и есть цифры числа a в q-ичной системе счисления и число a имеет вид: http://www.cyberforum.ru/cgi-bin/latex.cgi?a = (a_t...a_1a_0)_q.

Итак, из всего сказанного следует, что задание звучит некорректно, так как отрицательных цифр не бывает. А если они и выдумываются (как здесь), то это идет вразрез с математикой, нарушает весь баланс и ведет незнамо к чему.

Предполагаю, что

Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
цифра A имеет значение -1, а цифра B – значение -2
имеет другую подоплеку. Если автор просто не так выразился и в этой системе счисления {B,A,0,1,2,3,4,5,6} это просто цифры, то все очень просто. Сначала просто перевести, потом сдвинуть и заменить и все))
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
10.01.2012, 20:38 #52
Цитата Сообщение от Thinker Посмотреть сообщение
имеет другую подоплеку. Если автор просто не так выразился и в этой системе счисления {B,A,0,1,2,3,4,5,6} это просто цифры, то все очень просто. Сначала просто перевести, потом сдвинуть и заменить и все))
несколько постов ранее я предложил решение этой задачи. может быть оно не красиваое но работает.
Если вам не трудно.. сделайте ваше решение в соответсвии с просто перевести, потом сдвинуть и заменить и все. Буду вам очень благодарен если вы предложете простое решение. Я его к сожалению не нашел.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.01.2012, 19:50 #53
Цитата Сообщение от greeezz Посмотреть сообщение
несколько постов ранее я предложил решение этой задачи. может быть оно не красиваое но работает.
Если вам не трудно.. сделайте ваше решение в соответсвии с просто перевести, потом сдвинуть и заменить и все. Буду вам очень благодарен если вы предложете простое решение. Я его к сожалению не нашел.
На самом деле еще проще можно. Не расписывая, просто вывод трансформированного числа так можно осуществить:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define SET "BA0123456"
 
void Print(int a)
{
    if (a)
    {
        Print(a / 9);
        std::cout << SET[a % 9];
    }
}
 
int main()
{
   int a = 123;
   Print(a);
   return 0;
}
Хотя ваш вариант эквивалентен данному только если строку SET записать так:
#define SET "0123456BA"
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.01.2012, 20:07 #54
Я так сделал(через перевод)
Код большой, однако я его протестировал так
C++
1
2
3
4
5
6
7
int main()
{
for (int i = -100000; i <= 100000; ++i)
{
   if ( i != int( num(i) ) )
       std::cout << i << std::endl;
}
Ничего не вывелось, значит код полностью работоспособен.
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#include <iostream>
#include <string> 
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iterator>
 
class num
{
    std::string val;
    bool inc( std::string &, int );
    bool dec( std::string &, int );
public:
 
    num( std::string value ) { val = value; }
    
    num() { val = "0"; }
    
    num( int );
    
    operator int() const;
    
    friend std::ostream& operator << ( std::ostream&, const num& );
};
 
  
int main()
{
    std::cout << num( num("24") + num("5A") );
}
 
 
int int_pow( int a, int b )
 {
     if ( b == 0 )
        return 1;
        
     int c = a;
     
     for (int i = 1; i < b; ++i)
        c *= a;
        
    return c;
 }
 
std::ostream& operator << (std::ostream& stream, const num& n )
{
     stream << n.val;
     return stream;
}
 
num::operator int() const
{
    char values[128];
    
    values['B'] = -2;
    values['A'] = -1;
    values['0'] = 0;
    values['1'] = 1;
    values['2'] = 2;
    values['3'] = 3;
    values['4'] = 4;
    values['5'] = 5;
    values['6'] = 6;
        
    int res = 0;
    
    for (int i = 0; i < (int) val.size(); ++i)
    {
        res += values[ +val[ val.size() - i - 1 ] ] * int_pow(9, i);
    }
        
    return res;
}
 
bool num::inc( std::string &n, int pos )
{   
    switch ( n[pos] )
    {
        case 'B' :
            n[pos] = 'A';
            break;
        
        case 'A' :
            n[pos] = '0';
            break;
        
        case '0' :
        case '1' :
        case '2' :
        case '3' :
        case '4' :
        case '5' : 
            ++n[pos];
            break;
    
        case '6' :
            n[pos] = 'B';
            
            if ( pos > 0 )
            {
                return inc( n, pos - 1 );
            }
            else
            {
                n.insert( n.begin(), '1' );
                return true;
            }
            break;
            
        default:
            std::cerr << "Error in function \"inc\": ";
            std::cerr << "Incorrect symbol - " << n[pos] << std::endl;
            exit( EXIT_FAILURE );
    }
 
    return false;
}
 
bool num::dec( std::string &n, int pos )
{
    
    if ( pos == -1 )
    {
        n.insert( n.begin(), 'A' );
        return true;
    }
    
    switch ( n[pos] )
    {   
        case 'A' :
            n[pos] = 'B';
            break;
            
        case '0' :
            n[pos] = 'A';
            break;
        
        case '1' :
        case '2' :
        case '3' :
        case '4' :
        case '5' :
        case '6' : 
            --n[pos];
            break;
        
        case 'B' :
            n[pos] = '6';
            
            return dec( n, pos - 1 );
            
            break;          
            
        default:
            std::cerr << "Error in function \"dec\": ";
            std::cerr << "Incorrect symbol - " << n[pos] << std::endl;
            exit( EXIT_FAILURE );
    }
 
    return false;
}
 
num::num( int n )
{
    char sign = ( n < 0 ? '-' : '+' );
    
    std::vector< int > moduls;
    
    while ( n != 0 )
    {
        moduls.push_back( abs(n % 9) + '0' );
        n /= 9;
    }   
    
    std::string temp;
    temp.resize( moduls.size() );
    std::reverse_copy( moduls.begin(), moduls.end(), temp.begin() );
    
    if ( sign == '+' )
    {
        for ( int i = 0; i < (int) temp.size() ; ++i )
        {   
            if ( temp[i] >= '0' && temp[i] <= '6' )
                ;
            else if ( temp[i] == '7' || temp[i] == '8' )
            {
                temp[i] = ( temp[i] == '7' ? 'B' : 'A' );
                
                if ( i > 0 )
                {
                    i += inc( temp, i - 1);             
                }
                else 
                {
                    ++i;
                    temp.insert( temp.begin(), '1' );
                }
            }
            else
            {
                std::cerr << "Error in costructor num(int): ";
                std::cerr << "Incorrect symbol - " << temp[i] << std::endl;
                exit( EXIT_FAILURE );
            }
            
        }
    }
    else if ( sign == '-' )
    {
        
        for ( int i = 0; i < (int) temp.size() ; ++i )
        {   
            switch ( temp[i] )
            {
                case '0':
                    break;
                
                case '1' :
                    temp[i] = 'A';
                    break;
                    
                case '2' :
                    temp[i] = 'B';
                    break;
                
                case '3' :
                    temp[i] = '6';
                    i += dec( temp, i - 1 );
                    break;
                    
                case '4' :
                    temp[i] = '5';
                    i += dec( temp, i - 1 );
                    break;
                    
                case '5' :
                    temp[i] = '4';
                    i += dec( temp, i - 1 );
                    break;
                    
                case '6' :
                    temp[i] = '3';
                    i += dec( temp, i - 1 );
                    break;
                    
                case '7' :
                    temp[i] = '2';
                    i += dec( temp, i - 1 );
                    break;
                
                case '8' :
                    temp[i] = '1';
                    i += dec( temp, i - 1 );
                    break;
                
                default :
                    std::cerr << "Error in costructor num(int)\n";
                    std::cerr << "Incorrect symbol - " << temp[i] << std::endl;
                    exit( EXIT_FAILURE );
            }
        }
    }
    
    val = temp;
}
Это ведь четвертое задание из олимпиады? Есть идеи по второму?)
P.S. копипастить мой код не надо, это вполне могут обнаружить.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
12.01.2012, 21:50 #55
Цитата Сообщение от Thinker Посмотреть сообщение
На самом деле еще проще можно.
Либо я чего-то не понял, либо ваш код не корректен.
ТЕСТ ПОЛОЖИТЕЛЬНЫХ ЧИСЕЛ

1 A
2 0
3 1
4 2
5 3
6 4
7 5
8 6
9 AB
10 AA
11 A0
12 A1
13 A2
14 A3
15 A4
16 A5
......


А должно быть
1 1
2 2
3 3
4 4
5 5
6 6
7 1B
8 1A
9 10
..... и так далее

А с отрицательными числами ваш код вообще работать не может.

Пожалуйста уточните если я не прав или не понял вашу точку зрения.

Добавлено через 11 минут
diagon, потестил ваш код. результат как в аптеке и код выглядет намного чище чем мой вариант.

Цитата Сообщение от diagon Посмотреть сообщение
Это ведь четвертое задание из олимпиады? Есть идеи по второму?)
а второе это какое ?
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.01.2012, 22:06 #56
Цитата Сообщение от greeezz Посмотреть сообщение
а второе это какое ?
Нужно так подобрать функцию, что для данных вызовов она возвращала то, что написано в комментариях.
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
#include <stdio.h>
 
int foo( int A, int B, int C, int D )
{
    return ...;
}
 
int main()
{   
    printf("%d", foo(0, 0, 0, 0) );  // 0
    
    printf("%d", foo(0, 0, 0, 1) );  // 1
    
    printf("%d", foo(0, 0, 1, 0) );  // 1
    
    printf("%d", foo(0, 0, 1, 1) );  // 1
    
    printf("%d", foo(0, 1, 0, 0) );  // 0
    
    printf("%d", foo(0, 1, 0, 1) );  // 0
    
    printf("%d", foo(0, 1, 1, 0) );  // 1
    
    printf("%d", foo(0, 1, 1, 1) );  // 0
    
    printf("%d", foo(1, 0, 0, 0) );  // 1
    
    printf("%d", foo(1, 0, 0, 1) );  // 1
    
    printf("%d", foo(1, 0, 1, 0) );  // 1
    
    printf("%d", foo(1, 0, 1, 1) );  // 0
    
    printf("%d", foo(1, 1, 0, 0) );  // 1
    
    printf("%d", foo(1, 1, 0, 1) );  // 0
    
    printf("%d", foo(1, 1, 1, 0) );  // 1
    
    printf("%d", foo(1, 1, 1, 1) );  // 0
    
    return 0;
}
Т.е. для foo(0, 0, 0, 0) выводила 0, а для (0, 0, 1, 1) выводила 1.

При этом можно пользоваться только символами переменных, константой 1, круглыми скобками и xor(побитовое сложение) - ^
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
12.01.2012, 22:10 #57
Цитата Сообщение от diagon Посмотреть сообщение
Нужно так подобрать функцию, что для данных вызовов она выводила то, что написано в комментариях.
Спасибо. Вечерком подумаю над задачкой.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.01.2012, 22:26 #58
просто мысли вслух
а если представить
0=B 1=A 2=0 3=1 4=2 5=3 6=4 7=5 8=6
слева числа в 10 системе справа в ентой самой системе смещение равно -2
тогда сложение решается так
(x)+(y)+(-2) (смешение)=x+y-2
B+B =0+0-2 =-2
если -1=A
-2=B
-3=-1
-4=-2
6+6 = 8+8 -2 =14
вычитание
(x)-(y)-(-2) (смешение)=x+y+2
B-B =0-0+2=2(десятичное)=0
правда при проверках я сам запутался
и не смог прикинуть уножение и деление

Добавлено через 1 минуту
число 7 у на будет 1B ??? 9+(-2)???
alkagolik
Заблокирован
13.01.2012, 03:02 #59
Цитата Сообщение от diagon Посмотреть сообщение
Нужно так подобрать функцию, что для данных вызовов она возвращала то, что написано в комментариях.
это называется совершенные нормальные формы, бывают дизъюнктивные (результат 1) и конъюнктивные (результат 0). Учи матчать. Теорию автоматов гулял с пивком наверное вместо лекций?)) короче у тебя неполная функция это означает что недостающие комбинации дополняешь в результате единицу и строишшь СДНФ методом Квайна-Маккласки и картами Карно, потом теже комбинации дополняешь нулями и строишь СКНФ теми же методами. Дальше выбираешь наименьший вес функции, пропускаешь через алгоритм Петрика, дальше не помню, но есть еще один алгоритм, который позволяет поменять местами переменные и еще минимизировать функцию, потом переводишь в базис Жегалкина и будет печенько. Сейчас кину по 9й сс код, пока без функции инверсии.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
13.01.2012, 03:57 #60
Цитата Сообщение от ValeryS Посмотреть сообщение
число 7 у на будет 1B ??? 9+(-2)???
именно так.

-2 = B
-3 = A6
-4 = A5
и т.д.

Добавлено через 8 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
.... дополняешь в результате единицу и строишшь СДНФ методом Квайна-Маккласки и картами Карно, ...теже комбинации дополняешь нулями .... СКНФ теми же методами. Дальше .... наименьший вес функции, .... алгоритм Петрика, дальше ..... базис Жегалкина ....
ну прям так и хочется добавить ..... и начинаешь строить атомную станцию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2012, 03:57
Привет! Вот еще темы с ответами:

Перевод из десятичной в 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++
Дано задание: Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.01.2012, 03:57
Ответ Создать тему
Опции темы

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