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

Умножение в двоичной системе - C++

Восстановить пароль Регистрация
 
 
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
31.05.2014, 21:47     Умножение в двоичной системе #1
Добрый вечер. Помогите с реализацией умножения в двоичной системе. Дано два массива, например 1111 и 1111. Как написать цикл умножения друг на друга?

Добавлено через 56 минут
Я так понимаю нужно как-то создавать массивы, равные кол-ву элементов массива, и складывать их, но как реализовать на практике - хоть убейте не понимаю

Добавлено через 27 минут
Ну помогите пожалуйста, мне нужен только небольшой цикл в качестве примера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tegauss
29 / 23 / 23
Регистрация: 06.05.2014
Сообщений: 152
31.05.2014, 21:55     Умножение в двоичной системе #2
niikiita, Вам нужен результат, или непосредственно алгоритм умножения?
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
31.05.2014, 21:59  [ТС]     Умножение в двоичной системе #3
Цитата Сообщение от tegauss Посмотреть сообщение
niikiita, Вам нужен результат, или непосредственно алгоритм умножения?
Мне нужен результат на практике, в виде цикла, в котором перемножаются два двоичных числа, представленных в виде массивов. Алгоритм я знаю (на бумажке могу умножить).
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
31.05.2014, 22:07     Умножение в двоичной системе #4
Примерно так, ошибки не проверял:
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
void mul(char* a,char* b,char* res)
{
   int La=strlen(a);
   int Lb=strlen(b);
   int L=L1+L2;
   for(int i=0;i<=L)
         res[i]=0;//обнуляем результат
   for(int i=0;i<L1;i++) // слагаемых столько же, сколько и цифр в a
   {
       int k=L-1+i; // начальная позиция текущего разряда
       int perenos=0; // признак переноса
       if(a[i]-'0') // складывать надо только если не нулью Букву нуль отнимаем для того, чтобы получилось число (0 или 1)
       for(int j=L2-1;j>=0;j--) // идем с конца строки b
       {
            res[k]+=b[j]-'0'+perenos; // сложение с учетом переноса
            if(res[k]==2) // переполнение
            {
                 res[k]=1;perenos=1; 
            }
            k--; // к следующему разряду
       }
   }
   for(int i=0;i<L)
         res[i]+='0';//результат превращаем в текст
 
}
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
31.05.2014, 22:49     Умножение в двоичной системе #5
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
#include <iostream>
using namespace std;
int main()
{
    int n1, n2;
    cin >> n1 >> n2;
    int *a,* b,*res;
    a = new int[n1];
    b = new int[n2];
    for (int i = 0; i < n1; i++) cin >> a[i];
    for (int i = 0; i < n2; i++) cin >> b[i];
    res = new int[n2 + n1];
    for (int i = 0; i < n1 + n2; i++) res[i] = 0;
    
    for (int i = n2 - 1; i >= 0; i--)
    {
        
        for (int j = n1 - 1; j >= 0; j--)
        {
            if (res[j + i + 1]>1) {
                res[j + i + 1] = a[j] * b[i];
                res[i + j]++;
            }
            
            else
            {
                res[j + i + 1] += a[j] * b[i];
                if (res[j + i + 1] > 1) {
                    res[j + i + 1] = 0;
                    res[i + j] ++;
                }
            }
        }
    }
    
    for (int i = 0; i < n1 + n2; i++) cout << res[i];
    return 0;
}
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
31.05.2014, 23:25  [ТС]     Умножение в двоичной системе #6
Цитата Сообщение от Denis123456789 Посмотреть сообщение
#include <iostream>
using namespace std;
int main()
{
* * int n1, n2;
* * cin >> n1 >> n2;
* * int *a,* b,*res;
* * a = new int[n1];
* * b = new int[n2];
* * for (int i = 0; i < n1; i++) cin >> a[i];
* * for (int i = 0; i < n2; i++) cin >> b[i];
* * res = new int[n2 + n1];
* * for (int i = 0; i < n1 + n2; i++) res[i] = 0;
for (int i = n2 - 1; i >= 0; i--)
* * {
for (int j = n1 - 1; j >= 0; j--)
* * * * {
* * * * * * if (res[j + i + 1]>1) {
* * * * * * * * res[j + i + 1] = a[j] * b[i];
* * * * * * * * res[i + j]++;
* * * * * * }
else
* * * * * * {
* * * * * * * * res[j + i + 1] += a[j] * b[i];
* * * * * * * * if (res[j + i + 1] > 1) {
* * * * * * * * * * res[j + i + 1] = 0;
* * * * * * * * * * res[i + j] ++;
* * * * * * * * }
* * * * * * }
* * * * }
* * }
for (int i = 0; i < n1 + n2; i++) cout << res[i];
* * return 0;
}
Немного переделал код, мне так удобнее, только ответ выдает что-то типа: -51-52-51. Не подскажете в чем проблема?
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstring>      
 
using namespace std;
 
int main()
{
    char bvector1[100];
    char bvector2[100];char rezult[100];
        cin >> bvector1 >> bvector2;
    int L1 = strlen(bvector1);
    for(int i = 0; i < L1; i++)
    {
        bvector1[i] -= '0';
    }
    int L2 = strlen(bvector2);
    for(int i = 0; i < L2; i++)
    {
        bvector2[i] -= '0';
    } 
    for (int i = L2 - 1; i >= 0; i--)
    {
        
        for (int j = L1 - 1; j >= 0; j--)
        {
            if (rezult[j + i + 1]>1) {
                rezult[j + i + 1] = bvector1[j] * bvector2[i];
                rezult[i + j]++;
            }
            
            else
            {
                rezult[j + i + 1] += bvector1[j] * bvector2[i];
                if (rezult[j + i + 1] > 1) {
                    rezult[j + i + 1] = 0;
                    rezult[i + j] ++;
                }
            }
        }
    }
    for (int i = 0; i < L1 + L2; i++) cout << (int)rezult[i];
    system("Pause");
    return 0;
}
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
31.05.2014, 23:48     Умножение в двоичной системе #7
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
#include <iostream>
#include <string>
#include <cstring>      
 
using namespace std;
 
int main()
{
    char bvector1[100];
    char bvector2[100]; int rezult[100];
    cin >> bvector1 >> bvector2;
    int L1 = strlen(bvector1);
    for (int i = 0; i < L1; i++)
    {
        bvector1[i] -= '0';
    }
    int L2 = strlen(bvector2);
    for (int i = 0; i < L2; i++)
    {
        bvector2[i] -= '0';
    }
    for (int i = 0; i < L1 + L2; i++) rezult[i] = 0;
    for (int i = L2 - 1; i >= 0; i--)
    {
 
        for (int j = L1 - 1; j >= 0; j--)
        {
            if (rezult[j + i + 1]>1) {
                rezult[j + i + 1] = bvector1[j] * bvector2[i];
                rezult[i + j]++;
            }
 
            else
            {
                rezult[j + i + 1] += bvector1[j] * bvector2[i];
                if (rezult[j + i + 1] > 1) {
                    rezult[j + i + 1] = 0;
                    rezult[i + j] ++;
                }
            }
        }
    }
    for (int i = 0; i < L1 + L2; i++) cout << (int)rezult[i];
    system("Pause");
    return 0;
}
забыли обнулить массив результата
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
31.05.2014, 23:54  [ТС]     Умножение в двоичной системе #8
Цитата Сообщение от Denis123456789 Посмотреть сообщение
забыли обнулить массив результата
Точно! Благодарю вас!
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 00:02     Умножение в двоичной системе #9
Цитата Сообщение от Denis123456789 Посмотреть сообщение
C++
1
2
3
char bvector1[100]; 
char bvector2[100]; int rezult[100]; 
cin >> bvector1 >> bvector2;
Так делать плохо. Лучше использовать std::string, или же, если приперло массив чаров, то:
C++
1
cin.get( bvector1, sizeof(bvector1) );
Дабы избежать переполнения буфера.
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
01.06.2014, 00:08  [ТС]     Умножение в двоичной системе #10
Цитата Сообщение от Tulosba Посмотреть сообщение
cin.get( bvector1, sizeof(bvector1) );
не понимаю как это работает, можете объяснить, или где можно почитать?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 00:16     Умножение в двоичной системе #11
niikiita, http://www.cplusplus.com/reference/istream/istream/get/
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
01.06.2014, 00:20  [ТС]     Умножение в двоичной системе #12
Цитата Сообщение от Tulosba Посмотреть сообщение
плохо знаю английский(. тогда не могли бы вы эту часть заменить на более рациональную, чтобы я разобрался на примере
C++
1
2
3
char bvector1[100];
char bvector2[100];char rezult[100];
    cin >> bvector1 >> bvector2;
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 00:22     Умножение в двоичной системе #13
Цитата Сообщение от niikiita Посмотреть сообщение
плохо знаю английский(
Без английского в программировании будет очень сложно.
Цитата Сообщение от niikiita Посмотреть сообщение
эту часть заменить на более рациональную
Собственно я уже приводил ранее:
C++
1
2
cin.get( bvector1, sizeof(bvector1) );
cin.get( bvector2, sizeof(bvector2) );
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
01.06.2014, 00:32  [ТС]     Умножение в двоичной системе #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Без английского в программировании будет очень сложно.
Буду учить, сейчас времени не хватает.
Цитата Сообщение от Tulosba Посмотреть сообщение
cin.get( bvector1, sizeof(bvector1) );
cin.get( bvector2, sizeof(bvector2) );
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstring>      
 
using namespace std;
 
int main()
{
    char bvector1[100]; char bvector2[100];char rezult[100];
    cin.get( bvector1, sizeof(bvector1) );
    cin.get( bvector2, sizeof(bvector2) );
        
 
    int L1 = strlen(bvector1);
    for(int i = 0; i < L1; i++)
    {
        bvector1[i] -= '0';
    }
    int L2 = strlen(bvector2);
    for(int i = 0; i < L2; i++)
    {
        bvector2[i] -= '0';
    } 
    for (int i = 0; i < L1 + L2; i++) rezult[i] = 0;
    for (int i = L2 - 1; i >= 0; i--)
    {
        
        for (int j = L1 - 1; j >= 0; j--)
        {
            if (rezult[j + i + 1] > 1) {
                rezult[j + i + 1] = bvector1[j] * bvector2[i];
                rezult[i + j]++;
            }
            
            else
            {
                rezult[j + i + 1] += bvector1[j] * bvector2[i];
                if (rezult[j + i + 1] > 1) {
                    rezult[j + i + 1] = 0;
                    rezult[i + j]++;
                }
            }
        }
    }
    for (int i = 0; i < L1 + L2; i++) cout << (int)rezult[i];
    system("Pause");
    return 0;
}
При вводе любой строки выдает такое же количество нулей. Что я не так сделал?
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
01.06.2014, 01:19     Умножение в двоичной системе #15
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
#include <iostream>
#include <string>
#include <cstring>      
 
using namespace std;
 
int main()
{
    char bvector1[100]; char bvector2[100]; int rezult[100];
    cin.getline(bvector1, sizeof(bvector1)-1);
    cin.getline(bvector2, sizeof(bvector2)-1);
 
 
    int L1 = strlen(bvector1);
    
    int L2 = strlen(bvector2);
    
    for (int i = 0; i < L1 + L2; i++) rezult[i] = 0;
    for (int i = L2 - 1; i >= 0; i--)
    {
 
        for (int j = L1 - 1; j >= 0; j--)
        {
            if (rezult[j + i + 1] > 1) {
                rezult[j + i + 1] = (bvector1[j] - '0') * (bvector2[i] - '0');
                rezult[i + j]++;
            }
 
            else
            {
                rezult[j + i + 1] += (bvector1[j] - '0') * (bvector2[i] - '0');
                if (rezult[j + i + 1] > 1) {
                    rezult[j + i + 1] = 0;
                    rezult[i + j]++;
                }
            }
        }
    }
    for (int i = 0; i < L1 + L2; i++) cout << (int)rezult[i];
    system("Pause");
    return 0;
}
метод get (char buf[],int n,char razd='\n') читает n символов из входного потока и помещает их в массив buf, чтение приостанавливается преждевременно, если очередной символ входного потока равен razd, при этом символ разделителя остается во входном потоке. В итоге вы вводите первое число и нажимаете enter, первый оператор get считывает все до символа '\n', а второй сразу встречает '\n' и прекращает считывание, при этом во втором буфере оказывается только символ конца строки, который автоматически вставляется в буфер методом get, поэтому, кстати, надо считывать sizeof()-1 символ, чтобы для него было место в буфере.
А вот метод getline работает так же как get, но если встречает символ разделителя удаляет его из входного потока.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 06:11     Умножение в двоичной системе #16
Denis123456789, момент с разделителем в get я действительно не учел, но вот вычитать единицу вручную не надо. get считывает n-1 символ максимум.
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
01.06.2014, 17:05  [ТС]     Умножение в двоичной системе #17
Цитата Сообщение от Denis123456789 Посмотреть сообщение
метод get (char buf[],int n,char razd='\n') читает n символов из входного потока и помещает их в массив buf, чтение приостанавливается преждевременно, если очередной символ входного потока равен razd, при этом символ разделителя остается во входном потоке. В итоге вы вводите первое число и нажимаете enter, первый оператор get считывает все до символа '\n', а второй сразу встречает '\n' и прекращает считывание, при этом во втором буфере оказывается только символ конца строки, который автоматически вставляется в буфер методом get, поэтому, кстати, надо считывать sizeof()-1 символ, чтобы для него было место в буфере.
А вот метод getline работает так же как get, но если встречает символ разделителя удаляет его из входного потока.
Т. е. допусти я ввожу число 101010. Этот cin.getline(bvector1, sizeof(bvector1)); сделает из массива со 100 элементами массив с 6 элементами?

И еще такой вопрос, если я захочу переделать этот код в умножение например в восьмеричной системе, что нужно переделать?
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
01.06.2014, 18:06     Умножение в двоичной системе #18
Цитата Сообщение от niikiita Посмотреть сообщение
Т. е. допусти я ввожу число 101010. Этот cin.getline(bvector1, sizeof(bvector1)); сделает из массива со 100 элементами массив с 6 элементами?
нет массив будет из 100 элементов в любом случае, но полезная информация будет находится только в первых шести, седьмым будет '\0', который будет отделять используемую информацию, от остальной части массива.
Цитата Сообщение от niikiita Посмотреть сообщение
И еще такой вопрос, если я захочу переделать этот код в умножение например в восьмеричной системе, что нужно переделать?
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
#include <iostream>
#include <string>
#include <cstring>      
 
using namespace std;
 
int main()
{
    int osnovanie = 8;
    char bvector1[100]; char bvector2[100]; int rezult[100];
    cin.getline(bvector1, sizeof(bvector1)-1);
    cin.getline(bvector2, sizeof(bvector2)-1);
 
 
    int L1 = strlen(bvector1);
 
    int L2 = strlen(bvector2);
 
    for (int i = 0; i < L1 + L2; i++) rezult[i] = 0;
    for (int i = L2 - 1; i >= 0; i--)
    {
 
        for (int j = L1 - 1; j >= 0; j--)
        {
            
                rezult[j + i + 1] += (bvector1[j] - '0') * (bvector2[i] - '0');
                if (rezult[j + i + 1] > osnovanie-1) {              
                    rezult[i + j] += rezult[j + i + 1]/osnovanie;
                    rezult[j + i + 1] %= osnovanie;
                }
            }
        }
    for (int i = 0; i < L1 + L2; i++) cout << (int)rezult[i];
    system("Pause");
    return 0;
}
ну вот сделал вроде для произвольной с основанием osnovanie, но только, если основание больше 10, то надо в массив результата символы цифр больше 9 в виде букв прописывать
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
04.06.2014, 23:04  [ТС]     Умножение в двоичной системе #19
Цитата Сообщение от Denis123456789 Посмотреть сообщение
нет массив будет из 100 элементов в любом случае, но полезная информация будет находится только в первых шести, седьмым будет '\0', который будет отделять используемую информацию, от остальной части массива.
А каким образом это поможет от переполнения буфера?
Цитата Сообщение от Denis123456789 Посмотреть сообщение
надо в массив результата символы цифр больше 9 в виде букв прописывать
Как это сделать? чувствую себя попрошайкой, но у меня не получается сделать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2014, 03:10     Умножение в двоичной системе
Еще ссылки по теме:

Сложение в двоичной системе счисления C++
Калькулятор в двоичной системе C++

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

Или воспользуйтесь поиском по форуму:
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
06.06.2014, 03:10     Умножение в двоичной системе #20
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
#include <iostream>
#include <string>
#include <cstring>      
 
using namespace std;
 
int main()
{
    int osnovanie = 16;
    char bvector1[100]; char bvector2[100]; unsigned char rezult[100];
    cin.getline(bvector1, sizeof(bvector1)-1);
    cin.getline(bvector2, sizeof(bvector2)-1);
 
 
    int L1 = strlen(bvector1);
 
    int L2 = strlen(bvector2);
 
    for (int i = 0; i < L1 + L2; i++) rezult[i] = 0;
    for (int i = L2 - 1; i >= 0; i--)
    {
 
        for (int j = L1 - 1; j >= 0; j--)
        {
            
            rezult[j + i + 1] += ((bvector1[j] >= 'A' && bvector1[j] <= 'Z') ? 10 +  bvector1[j]-'A' : (bvector1[j] - '0')) * ((bvector2[i] >= 'A' && bvector2[i] <= 'Z') ? 10 +  bvector2[i]-'A' : (bvector2[i] - '0'));
            if (rezult[j + i + 1] > osnovanie - 1) {
                rezult[i + j] += rezult[j + i + 1] / osnovanie;
                rezult[j + i + 1] %= osnovanie;
            }
            
        }
        if (rezult[L1 + i ] > 9)
            rezult[L1 + i ] = 'A' + rezult[L1 + i ] - 10;
        else rezult[L1 + i ] += '0';
    }
    rezult[L1 + L2] = '\0';
    for (int i = 0; i < L1 ; i++)
    {
        if (rezult[i] > 9)
            rezult[i] = 'A' + rezult[i] - 10;
        else rezult[i] += '0';
    }
    cout << rezult;
    system("Pause");
    return 0;
}
ну как-то так, вроде работает

Добавлено через 7 минут
Цитата Сообщение от niikiita Посмотреть сообщение
А каким образом это поможет от переполнения буфера?
ну если ввести 200 символов конструкция cin.getline() считает только 99, а остальные оставит в потоке, а оператор >>так и будет считывать пока не встретит символ окончания ввода
Yandex
Объявления
06.06.2014, 03:10     Умножение в двоичной системе
Ответ Создать тему
Опции темы

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