Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 55
#1

Вычитание в троичной системе счисления

05.12.2014, 12:40. Просмотров 726. Ответов 6
Метки нет (Все метки)

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
#include <iostream>
 
using namespace std;
 
int main(){
    
    char input1[100];
    char input2[100];
    char output[101];
    
    int exit;
    int n1, n2, n;
    do{
        exit = 1;
        n1 = -1;
        cout << "Введите первое число:" << endl;
        cin >> input1;      
 
    while (input1[++n1] != '\0'){
            if (input1[n1] != '0' && input1[n1] != '1'){
                input1[0] = '\0';
                exit = 0;
                cout << "Введеная строка не является двоичным числом." << endl;
                break;
            }
        };                  
    }while (!exit);
    
    do{
        exit = 1;
        n2 = -1;
        cout << "Введите второе число:" << endl;
        cin >> input2;      
 
    while (input2[++n2] != '\0'){
            if (input2[n2] != '0' && input2[n2] != '1'){
                input2[0] = '\0';
                exit = 0;
                cout << "Введеная строка не является двоичным числом." << endl;
                break;
            }
        };                  
    }while (!exit);
    
    //поиск большего числа:
    int b = 0; //1 - первое больше, 2 - второе больше, 0 - равны
    if (n1 < n2)
        b = 2;
    else if (n1 > n2)
        b = 1;
    else{
        for (int i = 0; i < n1; ++i)
            if (input1[i] < input2[i]){
                b = 2;
                break;
            }else if (input1[i] > input2[i]){
                b = 1;
                break;
            }                       
    }
    
    if (b == 0){
        output[0] = 0;
        output[1] = '\0';
    }else{
        
        //добавляю нули и меняю числа местами если необходимо
        if (b == 2){
        
            char buf[100];
            for (int i = 0; i < n2; ++i){
                buf[i] = input2[i];
                if (i < (n2 - n1))
                    input2[i] = '0';
                else
                    input2[i] = input1[i - (n2 - n1)];
            }
            for (int i = 0; i < n2; ++i)
                input1[i] = buf[i];
            int b = n2;
            n2 = n1;
            n1 = b;
        }else{//b == 1
        
            char buf[100];
            for (int i = 0; i < n2; ++i)
                buf[i] = input2[i];
            for (int i = 0; i < (n1 - n2); ++i)
                input2[i] = '0';
            for (int i = (n1 - n2); i < n1; ++i)
                input2[i] = buf[i - (n1 - n2)];
        }
        
        //вычитаю из первого(большего) второе (меньшее)
        char invert[100];
        char p = '0';//перенос
        for (int i = 0; i < n1; ++i)
            if (p == '0'){
                if (input2[n1 - 1 - i] == '0')
                    invert[i] = input1[n1 - 1 - i];
                else if (input1[n1 - 1 - i] == '1')
                    invert[i] = '0';
                else{
                    invert[i] = '1';
                    p = '1';
                }                   
            }else{
                if (input1[n1 - 1 - i] == '0'){
                    if (input2[n1 - 1 - i] == '0'){
                        invert[i] = '1';
                        p = '1';
                    }else{
                        invert[i] = '0';
                        p = '1';
                    }
                }else{
                    if (input2[n1 - 1 - i] == '0'){
                        invert[i] = '0';
                        p = '0';
                    }else{
                        invert[i] = '1';
                        p = '1';
                    }
                }               
            } 
    
            if (p == '1'){
                invert[n1] = '1';
                n = n1 + 1;
            }else
                n = n1;
                
            for (int i = n - 1; i >= 0; --i)
                if (invert[i] == '0')
                    --n;
                else
                    break;
     
            for (int i = 0; i < n; ++i)
                output[i] = invert[n - 1 - i];  
            output[n] = '\0';
    }
    
    cout << output << endl;
        
    return 0;
}

Помогите переделать под троичную систему счисления
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2014, 12:40
Ответы с готовыми решениями:

Вывести на экран результат сложения в троичной системе счисления.
Пользователь вводит 2 строки символов длиной 5, содержащие положительный числа...

Вычитание в двоичной системе счисления
Нужно провести вычитание напрямую, без преобразования в десятичную систему...

Вычитание 2-х чисел в восьмеричной системе счисления
Помогите, пожалуйста, написать программу на С(С++): а)Вычитание 2-х чисел в...

Вычитание чисел в двоичной системе счисления
Это не подходит...

Вычитание в двоичной системе счисления двух чисел
Помогите написать код. Вычитание в двоичной системе счисления двух чисел. Надо...

6
D_in_practice
331 / 331 / 331
Регистрация: 02.10.2014
Сообщений: 666
05.12.2014, 13:44 #2
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
#include <iostream>
 
using namespace std;
 
const char BASIS = '3';//строка 68 слово троичным
 
int input(char in[]);//ââîä Г·ГЁГ±Г«Г*
int compare(char in1[], int n1, char in2[], int n2);//Г±Г°Г*ГўГ*ГҐГ*ГЁГҐ äâóõ Г·ГЁГ±ГҐГ«
void align(char in1[], int &n1, char in2[], int &n2);//ÂûðГ*ГўГ*ГЁГўГ*Г*ГЁГҐ Г·ГЁГ±ГҐГ«
 
int main(){
    
    char in1[100], in2[100], out[100];
    int n1, n2, n, sign;
    
    n1 = input(in1);//ââîæó Г·ГЁГ±Г«Г*
    n2 = input(in2);
    
    sign = compare(in1, n1, in2, n2);//Г±Г°Г*ГўГ*ГЁГўГ*Гѕ Г·ГЁГ±Г«Г*
    align(in1, n1, in2, n2);//âûðГ*ГўГ*ГЁГўГ*Гѕ Г·ГЁГ±Г«Г*
    
    char invert[100] = {};
    char transfer = 0;//ïåðåГ*îñ
    for (int i = 0; i < n1; ++i){
        
        if (in1[n1 - 1 - i] - in2[n1 - 1 - i] - transfer < 0){
            invert[i] = BASIS + in1[n1 - 1 - i] - in2[n1 - 1 - i] - transfer;
            transfer = 1;
        }else{
            invert[i] = '0' + in1[n1 - 1 - i] - in2[n1 - 1 - i] - transfer;
            transfer = 0;
        }
    }
 
    //ÓáèðГ*Гѕ ëèøГ*ГЁГҐ Г*óëè
    n = n1;
    for (int i = n - 1; i >= 0; --i)
        if (invert[i] == '0')
            --n;
        else
            break;
 
    for (int i = 0; i < n; ++i)
        out[i] = invert[n - 1 - i];
    out[n] = '\0';
    
    if (sign == 2)
        cout << '-';
    cout << out << endl;
       
    return 0;
}
 
int input(char input[]){
    
    int exit;
    int n;
    do{
        exit = 1;
        n = -1;
        cout << "Ââåäèòå ÷èñëî:" << endl;
        cin >> input;      
 
        while (input[++n] != '\0'){
            if (input[n] < '0' || BASIS - 1 < input[n]){
                input[0] = '\0';
                exit = 0;
                cout << "ÂâåäåГ*Г*Гї ñòðîêГ* Г*ГҐ ÿâëÿåòñÿ òðîè÷Г*ûì ÷èñëîì." << endl;
                break;
            }
        };                  
    }while (!exit);
    return n;
}
 
int compare(char in1[], int n1, char in2[], int n2){//Г±Г°Г*ГўГ*ГҐГ*ГЁГҐ
    
    //ïîèñê áîëüøåãî Г·ГЁГ±Г«Г*:
    int b = 0; //1 - ïåðâîå áîëüøå, 2 - âòîðîå áîëüøå, 0 - Г°Г*ГўГ*Г»
    if (n1 < n2)
        b = 2;
    else if (n1 > n2)
        b = 1;
    else{
        for (int i = 0; i < n1; ++i)
            if (in1[i] < in2[i]){
                b = 2;
                break;
            }else if (in1[i] > in2[i]){
                b = 1;
                break;
            }
    }
    return b;
}
 
void align(char in1[], int &n1, char in2[], int &n2){//ÂûðГ*ГўГ*ГЁГўГ*Г*ГЁГҐ Г·ГЁГ±ГҐГ«
    
    if (compare(in1, n1, in2, n2) == 2){
        
        char buf[100];
        for (int i = 0; i < n2; ++i){
            buf[i] = in2[i];
            if (i < (n2 - n1))
                in2[i] = '0';
            else
                in2[i] = in1[i - (n2 - n1)];
        }
        for (int i = 0; i < n2; ++i)
            in1[i] = buf[i];
        n1 = n2;
    
    }else{
        
        char buf[100];
        for (int i = 0; i < n2; ++i)
            buf[i] = in2[i];
        for (int i = 0; i < (n1 - n2); ++i)
            in2[i] = '0';
        for (int i = (n1 - n2); i < n1; ++i)
            in2[i] = buf[i - (n1 - n2)];
        n2 = n1;
    }
    in1[n1] = '\0';in2[n1] = '\0';
}
0
salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 55
05.12.2014, 20:45  [ТС] #3
D_in_practice, Спасибо огромное, очень выручил!!!!

Добавлено через 37 минут
D_in_practice, Напиши пожалуйста поподробней зачем нужен метод align(выравнивание) и Compare (сравнение) не совсем понимаю. Я настолько тупой!
0
D_in_practice
331 / 331 / 331
Регистрация: 02.10.2014
Сообщений: 666
05.12.2014, 20:57 #4
в чужом коде трудно разобраться, да и в своем тоже
Код
align - ставит большее число в первую позицию, 
меньшее во вторую, выравнивает числа делая их одной длинны:
111  и 2222  станет 2222 и 0111
2001 и 1     станет 2001 и 0001

Compare (сравнение) - сравнивает числа
если 1 -е больше вернет - 1
     2 -е               - 2
если равны       вернет - 0
0
salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 55
05.12.2014, 21:05  [ТС] #5
D_in_practice, А что мы поменяли в итоге в двоичном коде? чтобы сделать вычитание в троичной? ((((
0
D_in_practice
331 / 331 / 331
Регистрация: 02.10.2014
Сообщений: 666
05.12.2014, 21:10 #6
salvator19, Это совсем новая программа, теперь чтобы сделать из нее для двоичной нужно поменять
C++
1
2
const char BASIS = '2';//строка 5
cout << "Введеная строка не является двоичным числом." << endl;//строка 68
0
salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 55
05.12.2014, 21:14  [ТС] #7
D_in_practice, Спасибо большое, ты очень хороший человек. Побольше бы таких. Думаю как нибудь сдам.
0
05.12.2014, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2014, 21:14

Найти все числа с 2 единицами в троичной системе
Найти все числа с 2 единицами в троичной системе, поиск вести среди всех...

Проверить корректность числа в заданной системе счисления и перевести в другую систему счисления
На вычислительной практике дали такое задание: С клавиатуры вводятся 2...

Умножение в 4-системе счисления
Здравствуйте, мне нужно написать программу которая перемножает числа в 4...


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

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

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