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

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

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

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

02.01.2012, 13:23. Просмотров 14406. Ответов 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++
как делать?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
03.01.2012, 23:14 #16
B + B = B
Я так понял, местный ноль равен десятичной двойке. Цифра сама по себе не может быть отрицательной ну никак
0
alkagolik
Заблокирован
03.01.2012, 23:26 #17
http://www.cyberforum.ru/cgi-bin/latex.cgi?A1_{9} == -8_{10}or-10_{10}? ответа так и не поступило иопты пошел йа виску уничтожать иопт
1
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.01.2012, 00:01 #18
A+A = B
A+B = -6
B+B = -5

1A+1A = 2B
1A+1B = 2(-6) = 16
1B+1B = 2(-5) = 15
1A+10 = 2A
1A+11 = 20
1A+12 = 21
1B+11 = 2(-1) = 2A

т.е. если в результате сложения получается цифра меньшая чем B (т.e. -2) то от следующего десятка отнимает 1. Т.е. как я вижу в толбик считать не так уж и сложно
0
alkagolik
Заблокирован
04.01.2012, 09:31 #19
Цитата Сообщение от greeezz Посмотреть сообщение
A+B = -6
B+B = -5
в этой сс нету знаков, отрицательные представлены символами в старшем разряде
A + B = A6
B + B = A5
функцию сложения написать не сложно, хотя она и не простая. Сложно реализовать умножение, возведение в степень. Мы привыкли что 10 и -10 отличаются только знаком, а в этой сс всё иначе (как в эвм)-> это ключ к решению
Об отрицательности или положительности числа сигнализирует старший разряд, поэтому я бы не говорил что задача чисто математическая. По любому вычисления должны быть в исходной сс.
0
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.01.2012, 10:22 #20
Цитата Сообщение от alkagolik Посмотреть сообщение
в этой сс нету знаков,
Я понял. Подумал, что если представить именно в таком виде что если результат менше В (-2) то просто отнимать 1 от следующего разряда при сложении.
Цитата Сообщение от alkagolik Посмотреть сообщение
По любому вычисления должны быть в исходной сс
Возможно вы правы. Задача интересная буду тоже принимать участие. Все же теоретически меня не оставляет мысль попробовать сделать перевод в десятичную. Нет ничего сложно перевести число из данной СС в десятичную используя суммы произведений степеней основания системы счисления на соответствующие цифры.
Например :
B2B = -2*9^2+2*9^1+(-2)*9^0 = -81+18-2 = - 65
а вот обратно перевести.. вот это уже интереснее.
0
alkagolik
Заблокирован
04.01.2012, 10:32 #21
Цитата Сообщение от greeezz Посмотреть сообщение
а вот обратно перевести.. вот это уже интереснее.
не просто интереснее, а жуткий гемор . Сказать дальше? перевод из десятичной сс в исходную требует наличия функций сложения, умножения и возведения в степень чисел этой сс. А когда они есть то и переводить ничего никуда не надо.
0
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
04.01.2012, 12:05  [ТС] #22
Цитата Сообщение от greeezz Посмотреть сообщение
Все же теоретически меня не оставляет мысль попробовать сделать перевод в десятичную.
это я реализовал(там есть мой код несколько постов выше)

а вот переводить обратно как рас я запнулся и запостил на форум
0
alkagolik
Заблокирован
04.01.2012, 12:21 #23
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
а вот переводить обратно как рас я запнулся и запостил на форум
вы еще не поняли? надо программно реализовать АЛУ для чисел, в которых один разряд имеет 9 состояний.
0
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
04.01.2012, 13:23  [ТС] #24
я понял
я ответил greeezz
0
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
05.01.2012, 07:25 #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

2
alkagolik
Заблокирован
05.01.2012, 10:01 #26
мужЫГ Все таки решил переводить числа. Сомнительно все это
0
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
05.01.2012, 13:03  [ТС] #27
greeezz, большущие спасибо
шас буду вникать в код
0
Evg
Эксперт CАвтор FAQ
17801 / 6007 / 387
Регистрация: 30.03.2009
Сообщений: 16,511
Записей в блоге: 26
05.01.2012, 14:26 #28
greeezz, идея с представлением отрицательных чисел интересная. Насколько она правильная - затрудняюсь ответить, тут нужен человек с математическим складом ума. Хотя чисто математически получается, что такая система счисления изначально неверная, потому что число -1 можно представить как "А" и как "-1", т.е. имеется неоднозначность в преставлении чисел
0
alkagolik
Заблокирован
05.01.2012, 14:51 #29
Цитата Сообщение от Evg Посмотреть сообщение
имеется неоднозначность в преставлении чисел
все однозначно. Знаков в сс нету
0
Evg
Эксперт CАвтор FAQ
17801 / 6007 / 387
Регистрация: 30.03.2009
Сообщений: 16,511
Записей в блоге: 26
05.01.2012, 14:53 #30
Цитата Сообщение от alkagolik Посмотреть сообщение
Знаков в сс нету
Кто это тебе сказал?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2012, 14:53
Привет! Вот еще темы с ответами:

Перевод из десятичной в 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
Объявления
05.01.2012, 14:53
Ответ Создать тему
Опции темы

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