Форум программистов, компьютерный форум 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
04.01.2012, 10:32     Перевод в 9-чную систему счисления #21
Цитата Сообщение от greeezz Посмотреть сообщение
а вот обратно перевести.. вот это уже интереснее.
не просто интереснее, а жуткий гемор . Сказать дальше? перевод из десятичной сс в исходную требует наличия функций сложения, умножения и возведения в степень чисел этой сс. А когда они есть то и переводить ничего никуда не надо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
04.01.2012, 12:05  [ТС]     Перевод в 9-чную систему счисления #22
Цитата Сообщение от greeezz Посмотреть сообщение
Все же теоретически меня не оставляет мысль попробовать сделать перевод в десятичную.
это я реализовал(там есть мой код несколько постов выше)

а вот переводить обратно как рас я запнулся и запостил на форум
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
04.01.2012, 12:21     Перевод в 9-чную систему счисления #23
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
а вот переводить обратно как рас я запнулся и запостил на форум
вы еще не поняли? надо программно реализовать АЛУ для чисел, в которых один разряд имеет 9 состояний.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
04.01.2012, 13:23  [ТС]     Перевод в 9-чную систему счисления #24
я понял
я ответил greeezz
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
05.01.2012, 07:25     Перевод в 9-чную систему счисления #25
........................
Добавлено через 5 часов 50 минут
Вобщем доработал конвертацию.
Из 9СС отрицательные и положительные целые числа переводятся в десятичную и обратно.
Текущая версия:
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
#include <iostream>
using std::cout;
 
#include <cstring>
using std::string;
 
#include <cmath>
 
int toDec(string); //convert to dec
string toN(int);   //convert from dec positive numbers to 9-system.
string toMinusN(int); //convert from dec negative numbers to 9-system.
string calcul(int); //perform calculation
 
int main() {
 
    int inDec;
 
    cout << "24 + 5A = ";
    inDec = toDec("24") + toDec("5A");
    cout << calcul(inDec) << "\n";
 
    cout << "B5 + 61 = ";
    inDec = (toDec("B5") + toDec("61"));
    cout << calcul(inDec) << "\n";
 
    cout << "52 * A6 = ";
    inDec = (toDec("52") * toDec("A6"));
    cout << calcul(inDec) << "\n";
 
    cout << "312 * 41B= ";
    inDec = (toDec("312") + toDec("41B"));
    cout << calcul(inDec) << "\n";
 
    cout << "A1A * B2B = ";
    inDec = (toDec("A1A") * toDec("B2B"));
    cout << calcul(inDec) << "\n";
 
    return 0;
}
 
string calcul(int inDec) {
    if (inDec < 0) {
        return toMinusN(inDec);
    }
    return toN(inDec);
 
}
 
//convert to dec
int toDec(string number) {
    int result = 0;
    int numberSize;
 
    numberSize = number.size();
    for (int i = 0; i < numberSize; ++i) {
        if (number.at(i) == 'A') {
            result += -1 * pow(9, numberSize - 1 - i);
        } else if (number.at(i) == 'B') {
            result += -2 * pow(9, numberSize - 1 - i);
        } else {
            result = result + (pow(9, numberSize - 1 - i) * (number.at(i) - 48));
        }
    }
    return result;
}
 
//convert ppositiv numbers from dec
string toN(int number) {
    char digits[3] = { 'B', 'A', '0' };
    string result;
    size_t resultSize;
    char buf;
 
    while (number > 0) {
        result += number % 9 + '0';
        number /= 9;
    }
 
    resultSize = result.size();
 
    for (size_t i = 0; i < resultSize; ++i) {
        if ((int(result.at(i)) - 48) > 6) {
            if (i + 1 == resultSize) {
                result += "0";
            }
            if (result.at(i + 1) == 'A') {
                result.at(i + 1) = '0';
            } else if (result.at(i + 1) == 'B') {
                result.at(i + 1) = 'A';
            } else {
                result.at(i + 1) = ((int(result.at(i + 1)) - 48) + 1) + '0';
            }
            result.at(i) = digits[(int(result.at(i)) - 48) - 6 - 1];
        }
    }
 
    resultSize = result.size();
 
    for (size_t i = 0; i < resultSize / 2; ++i) {
        buf = result.at(i);
        result.at(i) = result.at((resultSize - 1) - i);
        result.at((resultSize - 1) - i) = buf;
    }
    return result;
}
 
//convert negative numbers from dec
string toMinusN(int number) {
    string result, buf;
    size_t resultSize;
    bool shift = false;
    number *= -1;
 
    if (number == 0) {
        result = '0';
    } else {
        while (number > 0) {
            result += number % 9 + '0';
            number /= 9;
        }
 
        resultSize = result.size();
 
        for (size_t i = 0; i < resultSize; ++i) {
            if ((int(result.at(i)) - 48) == 2 && shift == false) {
                buf += 'B';
            } else if ((int(result.at(i)) - 48) == 2 && shift == true) {
                buf += "6";
                shift = true;
            } else {
                if ((int(result.at(i)) - 48) == 1) {
                    if (shift == true) {
                        buf += 'B';
                        shift = false;
                    } else {
                        buf += 'A';
                    }
                } else {
                    if ((int(result.at(i)) - 48) == 0) {
                        if (shift == true) {
                            buf += 'A';
                            shift = false;
                        } else {
                            buf += '0';
                        }
                    } else {
                        if (shift == true) {
                            buf += (8 - ((int(result.at(i)) - 48))) + '0';
                        } else {
                            buf += (9 - ((int(result.at(i)) - 48))) + '0';
                            shift = true;
                        }
                    }
                }
            }
        }
        if (shift == true) {
            buf += 'A';
            shift = false;
        }
 
        resultSize = buf.size();
        result.clear();
 
        for (size_t i = 0; i < resultSize; ++i) {
            result += buf.at(resultSize - 1 - i);
        }
    }
    return result;
 
}
по большому счету теперь можно вообще любые операция выполнять.

ВЫВОД ПРИМЕРОВ ЗАДАЧИ

24 + 5A = 1B3
B5 + 61 = 46
52 * A6 = B23
312 * 41B= 1B20
A1A * B2B = 15552


ТЕСТЫ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ

-1 A -10 AA
-2 B -20 BB
-3 A6 -30 A56
-4 A5 -40 A45
-5 A4 -50 A34
-6 A3 -60 A23
-7 A2 -70 A12
-8 A1 -80 A01
-9 A0 -90 AA0
-10 AA -100 ABA
-11 AB -110 B6B
-12 B6 -120 B46
-13 B5 -130 B35
-14 B4 -140 B24
-15 B3 -150 B13
-16 B2 -160 B02
-17 B1 -170 BA1
-18 B0 -180 BB0
-19 BA -190 A66A
-20 BB -200 A65B
-21 A66 -210 A636
-22 A65 -220 A625
-23 A64 -230 A614
-24 A63 -240 A603
-25 A62 -250 A6A2
-26 A61 -260 A6B1
-27 A60 -270 A560
-28 A6A -280 A55A
-29 A6B -290 A54B
-30 A56 -300 A526
-31 A55 -310 A515
-32 A54 -320 A504
-33 A53 -330 A5A3
-34 A52 -340 A5B2
-35 A51 -350 A461
-36 A50 -360 A450
-37 A5A -370 A44A
-38 A5B -380 A43B
-39 A46 -390 A416
-40 A45 -400 A405
-41 A44 -410 A4A4
-42 A43 -420 A4B3
-43 A42 -430 A362
-44 A41 -440 A351
-45 A40 -450 A340
-46 A4A -460 A33A
-47 A4B -470 A32B
-48 A36 -480 A306
-49 A35 -490 A3A5
-50 A34 -500 A3B4
-51 A33 -510 A263
-52 A32 -520 A252
-53 A31 -530 A241
-54 A30 -540 A230
-55 A3A -550 A22A
-56 A3B -560 A21B
-57 A26 -570 A2A6
-58 A25 -580 A2B5
-59 A24 -590 A164
-60 A23 -600 A153
-61 A22 -610 A142
-62 A21 -620 A131
-63 A20 -630 A120
-64 A2A -640 A11A
-65 A2B -650 A10B
-66 A16 -660 A1B6
-67 A15 -670 A065
-68 A14 -680 A054
-69 A13 -690 A043
-70 A12 -700 A032
-71 A11 -710 A021
-72 A10 -720 A010
-73 A1A -730 A00A
-74 A1B -740 A0AB
-75 A06 -750 AA66
-76 A05 -760 AA55
-77 A04 -770 AA44
-78 A03 -780 AA33
-79 A02 -790 AA22
-80 A01 -800 AA11
-81 A00 -810 AA00
-82 A0A -820 AAAA
-83 A0B -830 AABB
-84 AA6 -840 AB56
-85 AA5 -850 AB45
-86 AA4 -860 AB34
-87 AA3 -870 AB23
-88 AA2 -880 AB12
-89 AA1 -890 AB01
-90 AA0 -900 ABA0
-91 AAA -910 ABBA
-92 AAB -920 B66B
-93 AB6 -930 B646
-94 AB5 -940 B635
-95 AB4 -950 B624
-96 AB3 -960 B613
-97 AB2 -970 B602
-98 AB1 -980 B6A1
-99 AB0 -990 B6B0
-100 ABA -1000 B56A

ТЕСТЫ ПОЛОЖИТЕЛЬНЫХ ЧИСЕЛ

1 1 _____ 10 11
2 2 _____ 20 22
3 3 _____ 30 33
4 4 _____ 40 44
5 5 _____ 50 55
6 6 _____ 60 66
7 1B _____ 70 1AB
8 1A _____ 80 10A
9 10 _____ 90 110
10 11 _____ 100 121
11 12 _____ 110 132
12 13 _____ 120 143
13 14 _____ 130 154
14 15 _____ 140 165
15 16 _____ 150 2B6
16 2B _____ 160 20B
17 2A _____ 170 21A
18 20 _____ 180 220
19 21 _____ 190 231
20 22 _____ 200 242
21 23 _____ 210 253
22 24 _____ 220 264
23 25 _____ 230 3B5
24 26 _____ 240 3A6
25 3B _____ 250 31B
26 3A _____ 260 32A
27 30 _____ 270 330
28 31 _____ 280 341
29 32 _____ 290 352
30 33 _____ 300 363
31 34 _____ 310 4B4
32 35 _____ 320 4A5
33 36 _____ 330 406
34 4B _____ 340 42B
35 4A _____ 350 43A
36 40 _____ 360 440
37 41 _____ 370 451
38 42 _____ 380 462
39 43 _____ 390 5B3
40 44 _____ 400 5A4
41 45 _____ 410 505
42 46 _____ 420 516
43 5B _____ 430 53B
44 5A _____ 440 54A
45 50 _____ 450 550
46 51 _____ 460 561
47 52 _____ 470 6B2
48 53 _____ 480 6A3
49 54 _____ 490 604
50 55 _____ 500 615
51 56 _____ 510 626
52 6B _____ 520 64B
53 6A _____ 530 65A
54 60 _____ 540 660
55 61 _____ 550 1BB1
56 62 _____ 560 1BA2
57 63 _____ 570 1B03
58 64 _____ 580 1B14
59 65 _____ 590 1B25
60 66 _____ 600 1B36
61 1BB _____ 610 1B5B
62 1BA _____ 620 1B6A
63 1B0 _____ 630 1AB0
64 1B1 _____ 640 1AA1
65 1B2 _____ 650 1A02
66 1B3 _____ 660 1A13
67 1B4 _____ 670 1A24
68 1B5 _____ 680 1A35
69 1B6 _____ 690 1A46
70 1AB _____ 700 1A6B
71 1AA _____ 710 10BA
72 1A0 _____ 720 10A0
73 1A1 _____ 730 1001
74 1A2 _____ 740 1012
75 1A3 _____ 750 1023
76 1A4 _____ 760 1034
77 1A5 _____ 770 1045
78 1A6 _____ 780 1056
79 10B _____ 790 11BB
80 10A _____ 800 11AA
81 100 _____ 810 1100
82 101 _____ 820 1111
83 102 _____ 830 1122
84 103 _____ 840 1133
85 104 _____ 850 1144
86 105 _____ 860 1155
87 106 _____ 870 1166
88 11B _____ 880 12AB
89 11A _____ 890 120A
90 110 _____ 900 1210
91 111 _____ 910 1221
92 112 _____ 920 1232
93 113 _____ 930 1243
94 114 _____ 940 1254
95 115 _____ 950 1265
96 116 _____ 960 13B6
97 12B _____ 970 130B
98 12A _____ 980 131A
99 120 _____ 990 1320
100 121 _____ 1000 1331

alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 10:01     Перевод в 9-чную систему счисления #26
мужЫГ Все таки решил переводить числа. Сомнительно все это
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
05.01.2012, 13:03  [ТС]     Перевод в 9-чную систему счисления #27
greeezz, большущие спасибо
шас буду вникать в код
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
05.01.2012, 14:26     Перевод в 9-чную систему счисления #28
greeezz, идея с представлением отрицательных чисел интересная. Насколько она правильная - затрудняюсь ответить, тут нужен человек с математическим складом ума. Хотя чисто математически получается, что такая система счисления изначально неверная, потому что число -1 можно представить как "А" и как "-1", т.е. имеется неоднозначность в преставлении чисел
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 14:51     Перевод в 9-чную систему счисления #29
Цитата Сообщение от Evg Посмотреть сообщение
имеется неоднозначность в преставлении чисел
все однозначно. Знаков в сс нету
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
05.01.2012, 14:53     Перевод в 9-чную систему счисления #30
Цитата Сообщение от alkagolik Посмотреть сообщение
Знаков в сс нету
Кто это тебе сказал?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 14:54     Перевод в 9-чную систему счисления #31
ну я говорю об этой сс, просто не знаю как ее назвать. отрицательные представлены символами в старшем разряде.

Добавлено через 45 секунд
AA == -10
A0 == -9
A1 == -8
и т.д.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
05.01.2012, 15:10     Перевод в 9-чную систему счисления #32
Я тоже говорю про данную сс. В условии ничего не сказано про отсутствие знака для представления отрицательных чисел, равно как вообще ничего не сказано про представление отрицательных чисел. Может ты что-то ещё знаешь об этой задаче, но ТС об этом не говорил

Добавлено через 11 минут
Хотя какая-то логичность в этом есть....
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 15:18     Перевод в 9-чную систему счисления #33
Ну и что что не сказано, это вытекает из самой сс, а она хоть и кривая, но полна (самодостаточна). На тритных БИС она не составила бы особой проблемы.
thick_int
Заблокирован
05.01.2012, 18:30     Перевод в 9-чную систему счисления #34
Цитата Сообщение от alkagolik Посмотреть сообщение
все однозначно. Знаков в сс нету
Эта кривая система неоднозначна и с положительными числами.
Например, любое число вида 2^n, где n - число четно можно представить и в виде 2^n и в виде B^n.
Единственно, что может более-менее придать форму некоей корректностиь этой задачи. - это на само деле простой счет, то есть правило посредством которого оссуществляется переход от записи предыдущего числа к записи последующего числа.
А правило это очень простое, если текущий разряд меньше 6, то все проиходит, как с обычной числовой системой, а если больше 6, то происходит его ззамена на B с переносом 1 в более высокий разряд. Ну и разряд, равный B заменяется на A.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 18:40     Перевод в 9-чную систему счисления #35
thick_int, свежая и актуальная мысль. Однако будет ли верным "примерять" соглашения десятичной арифметики на арифметику "этой сс"? и почему бы и нет
Цитата Сообщение от thick_int
n - число четно можно представить и в виде 2^n и в виде B^n.
в конце концов в привычной сс все аналогично: http://www.cyberforum.ru/cgi-bin/latex.cgi?(-2==B_{9})^{2}=(2==2_{9})^{2}=4. Почему-то лень моделировать троичную логику на двоичных векторах.
thick_int
Заблокирован
05.01.2012, 18:55     Перевод в 9-чную систему счисления #36
Да и еще, те кто считает, что отрицательных знаков в этой системе быть не должно, очень ошибаются.
Поробуйте для начала представить в этой системе -3 и убедитесь в том, что без знака минуса это никак нельзя.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
05.01.2012, 18:56     Перевод в 9-чную систему счисления #37
Цитата Сообщение от thick_int Посмотреть сообщение
Поробуйте для начала представить в этой системе -3 и убедитесь в том, что без знака минуса это никак нельзя.
A6 = -1 * 9 + 6 = -3
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 19:02     Перевод в 9-чную систему счисления #38
Цитата Сообщение от thick_int Посмотреть сообщение
без знака минуса это никак нельзя.
уже evg показал что можно... А разве в регистрах компьютеров есть знаки + и -?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
05.01.2012, 19:14     Перевод в 9-чную систему счисления #39
Цитата Сообщение от alkagolik Посмотреть сообщение
А разве в регистрах компьютеров есть знаки + и -?
У плавающих есть. У целочисленных - на основной массе процессоров нет, потому как используется система представления целых чисел в дополнительном коде. Но есть и такие процессоры (сигнальные), где используется и система хранения с знаком

Добавлено через 55 секунд
thick_int, ты не мне плюсик ставь, а alkagolik'у, это он прочухал про такое хранение отрицательных чисел
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2012, 19:20     Перевод в 9-чную систему счисления
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
thick_int
Заблокирован
05.01.2012, 19:20     Перевод в 9-чную систему счисления #40
Да я тоже почитал только то про такие системы и действительно в таких системах знак минус отсутствует.
Yandex
Объявления
05.01.2012, 19:20     Перевод в 9-чную систему счисления
Ответ Создать тему
Опции темы

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