С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58

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

05.12.2014, 12:40. Показов 2405. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2014, 12:40
Ответы с готовыми решениями:

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

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

Вычитание чисел в двоичной системе счисления
Это не подходит https://www.cyberforum.ru/cpp-beginners/thread584648.html#post3072102. Помогите написать код на с++ . А то скоро конец...

6
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
05.12.2014, 13:44
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
Сообщений: 58
05.12.2014, 20:45  [ТС]
D_in_practice, Спасибо огромное, очень выручил!!!!

Добавлено через 37 минут
D_in_practice, Напиши пожалуйста поподробней зачем нужен метод align(выравнивание) и Compare (сравнение) не совсем понимаю. Я настолько тупой!
0
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
05.12.2014, 20:57
в чужом коде трудно разобраться, да и в своем тоже
Code
1
2
3
4
5
6
7
8
9
align - ставит большее число в первую позицию, 
меньшее во вторую, выравнивает числа делая их одной длинны:
111  и 2222  станет 2222 и 0111
2001 и 1     станет 2001 и 0001
 
Compare (сравнение) - сравнивает числа
если 1 -е больше вернет - 1
     2 -е               - 2
если равны       вернет - 0
0
 Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
05.12.2014, 21:05  [ТС]
D_in_practice, А что мы поменяли в итоге в двоичном коде? чтобы сделать вычитание в троичной? ((((
0
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
05.12.2014, 21:10
salvator19, Это совсем новая программа, теперь чтобы сделать из нее для двоичной нужно поменять
C++
1
2
const char BASIS = '2';//строка 5
cout << "Введеная строка не является двоичным числом." << endl;//строка 68
0
 Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
05.12.2014, 21:14  [ТС]
D_in_practice, Спасибо большое, ты очень хороший человек. Побольше бы таких. Думаю как нибудь сдам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2014, 21:14
Помогаю со студенческими работами здесь

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

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

Найти все числа с 2 единицами в троичной системе
Найти все числа с 2 единицами в троичной системе, поиск вести среди всех трехзначных десятичных чисел. Заполнить ими множество и вывести...

Перевод чисел с троичной в пятеричную систему счисления
Помогите пожалуйста с кодом в C или C++ для перевода чисел с троичной в пятеричную систему счисления. Буду очень благодарен!

Перевод чисел из троичной системы счисления в десятичную
Разработать программу, которая будет с троичной системы счисления переводить в десятичную, как целые так и дробные. С помощью массивов. на...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru