Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
annussaa
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 39
1

Функция умножения двух массивов

01.11.2014, 19:46. Просмотров 1280. Ответов 12
Метки нет (Все метки)

Даны два массива символов a и b (состоят из цифр), репрезентирующие два целых положительных числа. Создать функцию, которая создаёт третий массив c, репрезентирующий умножение двух целых положительных чисел. Алгоритм нужно реализовать так, чтобы (при помощи операции *) умножались однозначные числа(как столбиком на бумаге). Функция должна обрабатывать массивы длиной до 30 символов включительно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2014, 19:46
Ответы с готовыми решениями:

Создать производный класс, в котором реализована функция умножения вектора на число и функция сложения двух векторов
Write программу с использованием класса Вектор (не без помощи форумчанина), но...

Сформировать матрицу путем умножения соответствующих элементов двух массивов
Помогите сделать На основе исходных массивов A и B (n и m – рабочие размеры...

метод создания двух массивов, для дальнейшего умножения их между собой
Помогите правильно описать метод создания двух массивов А и В. Как правильно...

Рекурсия: функция умножения двух чисел, используя только операцию сложения
Напишите функцию умножения двух чисел, используя только операцию ...

Функция для сравнения двух массивов
Функция нужна для ответа на вопрос задачи "Верно ли, что все элементы 1-ой...

12
Somebody
2802 / 1613 / 251
Регистрация: 03.12.2007
Сообщений: 4,215
Завершенные тесты: 3
01.11.2014, 20:42 2
Что есть и в чём именно проблема?
0
Erato
20 / 8 / 7
Регистрация: 22.10.2012
Сообщений: 76
01.11.2014, 22:01 3
Не до конца поняла само задание, но вот вам 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
#include <cstdlib>
#include <iostream>
int num;int i; int j;
using namespace std;
int M (int a, int b)
{
  return a*b;  
}
 
int main(int argc, char *argv[])
{   
    cout<<"Input size of array ";
    cin>>num;
    int *A = new int[num];
    for (int i=0;i<num;i++){
        A[i] = rand();
        cout << "A[" << i <<"] = "<< A[i]<<"; "<<endl;}
        cout <<"______________________"<<endl;
    int *B = new int[num];
    for (int j=0;j<num;j++){
         B[j] = rand();
        cout << "B[" << j <<"] = "<< B[j]<<"; "<<endl;
 
}
int a = A[i];
int b = B[j];
cout << M(a, b) <<endl;
delete [] A;
delete [] B;
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
D_in_practice
332 / 332 / 331
Регистрация: 02.10.2014
Сообщений: 666
03.11.2014, 17:35 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
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
#include <iostream>
#include <string>
 
using namespace std;
 
string sum(string, string);
string product(string, string);
 
int main(){
    
    string a, b;
    
    cout << "a = ";
    cin >> a;
    cout << "b = ";
    cin >> b;
 
    cout <<  product(a, b) << endl;
    
}
 
string sum(string a, string b){
        
    string empty;//âûðГ*ГўГ*ГЁГўГ*Гѕ ñòðîêè
    if (a.length() > b.length()){
        for (int i = 0; i < a.length() - b.length(); ++i)
            empty.push_back('0');
        for (int i = 0; i < b.length(); ++i)
            empty.push_back(b[i]);
            b = empty;
    }else if (b.length() > a.length()){
        for (int i = 0; i < b.length() - a.length(); ++i)
            empty.push_back('0');
        for (int i = 0; i < a.length(); ++i)
            empty.push_back(a[i]);
            a = empty;
    }
            
    string c;
    char transfer = '0';
    for (int i = a.length() - 1; i >= 0; --i){      
        c.push_back((a[i] - '0' + b[i] - '0' + transfer - '0') % 10 + '0');
        transfer = (a[i] - '0' + b[i] - '0' + transfer - '0') / 10 + '0';       
    }
    if (transfer != '0')
        c.push_back(transfer);
    
    for (int i = 0; i < c.length()/ 2; ++i){//ïåðåâîðГ*Г·ГЁГўГ*Гѕ ñòðîêó
        char buf = c[i];
        c[i] = c[c.length() - 1 - i];
        c[c.length() - 1 - i] = buf;
    }
        
    return c;
}
 
string product(string a, string b){
    
    string c = "0";
    for (int i = b.length() - 1; i >= 0; --i){
        int transfer = 0;
        string temp;
        for (int j = a.length() - 1; j >= 0; --j){
            int ib = b[i] - '0';
            int ia = a[j] - '0';
            temp.push_back((transfer + ib * ia) % 10 + '0');
            transfer = (transfer + ib * ia) / 10;
        }
        if (transfer != 0)
            temp.push_back(transfer + '0');
        
        for (int j = 0; j < temp.length()/ 2; ++j){//ïåðåâîðГ*Г·ГЁГўГ*Гѕ ñòðîêó
            char buf = temp[j];
            temp[j] = temp[temp.length() - 1 - j];
            temp[temp.length() - 1 - j] = buf;
        }
        
        for (int j = 0; j < b.length() - i - 1; ++j)
            temp.push_back('0');
        
        c = sum(c, temp);
    }
    return c;
}


К сожалению не удалось без использования string обойтись.
Код
//хотел
char* product(char*, char*)
//но куча ошибок с которыми я не могу справиться, типа появляются символы непонятные
//размер контролировал при помощи символа '\0' в конце
ide - dev c++
ОС - Win 7
Подскажите есть ли возможность работать только с массивами char в подобных задачах.
Интересует именно передача в функцию, или мне лучше не заморачиваться и забыть?
Я где то увидел что могут еще быть проблемы с утечкой памяти, в таких случаях?
Тогда интересно как это пишется на С?

И еще вопрос, когда я пытался использовать итератор, компилятор не дал присвоить значение int итератору, почему?
Код
for(int i = a.end(); i >=0; --i)
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4837 / 2482 / 695
Регистрация: 18.10.2014
Сообщений: 4,290
03.11.2014, 18:01 5
Цитата Сообщение от D_in_practice Посмотреть сообщение
компилятор не дал присвоить значение int итератору, почему?

C++
1
for(int i = a.end(); i >=0; --i)
А что вы этим пытались сделать? С чего бы это вдруг 'string::iterator' станет присваиваться в переменную типа 'int'?
1
D_in_practice
332 / 332 / 331
Регистрация: 02.10.2014
Сообщений: 666
03.11.2014, 18:05 6
TheCalligrapher, Спасибо что отозвались, я пытался получить номер последнего элемента т.к. size и length, выглядят некрасиво, а для чего он нужен?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4837 / 2482 / 695
Регистрация: 18.10.2014
Сообщений: 4,290
03.11.2014, 18:13 7
Цитата Сообщение от D_in_practice Посмотреть сообщение
а для чего он нужен
Хм... Затем же, зачем вообще нужны итераторы. 'string' - это фактически контейнер 'char'-ов. Соответственно у него есть много из того, что есть у стандартных контейнеров. Итераторы, push_back, и т.д. и т.п.
1
D_in_practice
332 / 332 / 331
Регистрация: 02.10.2014
Сообщений: 666
03.11.2014, 18:35 8
Спасибо, я разобрался, что это указатель на тип элемента контейнера в моем случае *char
0
Alexandr_1982
180 / 81 / 30
Регистрация: 04.11.2013
Сообщений: 413
Записей в блоге: 4
03.11.2014, 20:15 9
long-arithmetic.cpp в http://www.cyberforum.ru/attachments/99732d1318247433
1
annussaa
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 39
25.11.2014, 21:18  [ТС] 10
D_in_practice, спасибо большое! только с 40 строчки далее сложно и почти невозможно понять... извиняюсь, "очень" начинающая.
0
annussaa
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 39
05.12.2014, 22:17  [ТС] 11
и так. в общем, по требованию преподавателя, я была вынуждена переделать код D_in_practice под char*. Все вылезающие ошибки я, вроде, пофиксила. Но проблема в том, что код все равно не работает. Знаю, что дело в массивах, но пока не в состоянии довести код до ума. После ввода a, b выдает segmentation fault. Может, кто-нибудь знает, как исправить?

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
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
char sum(char* a, char* b){
    char result[30];
    char* empt;
    const char* null = "0";
    if (strlen(a) > strlen(b)) { 
        for (int i = 0; i < strlen(a) - strlen(b); ++i)
            strcat(empt, null); 
        for (int i = 0; i < strlen(b); ++i)
            strcat(empt, b); 
            b = empt; 
        }
    else if (strlen(b) > strlen(a)) { 
        for (int i = 0; i < strlen(b) - strlen(a); ++i) 
            strcat(empt, null);
        for (int i = 0; i < strlen(a); ++i)
            strcat(empt, a);
            a = empt;
        }
 
    char* c;
    const char* transfer = "0"; 
    for (int i = strlen(a) - 1; i >= 0; --i) { 
        int aa = a[i] - '0';
        int bb = b[i] - '0';
        int ttransfer = transfer[i] - '0';
        strcat(c, ((aa + bb + ttransfer) % 10 + null));
        transfer = (atoi(a) + atoi(b) + atoi(transfer)) / 10 + null;
    }  
    if (transfer != null) strcat(c, transfer);
 
    for (int i = 0; i < strlen(c)/ 2; ++i){
        char buf = c[i]; 
        c[i] = c[strlen(c) - 1 - i];
        c[strlen(c) - 1 - i] = buf;
        strcpy(result, c);
    }
    return result[30];
}
 
char reiz(char* a, char* b){
 
    const char* null = "0";
    char c[30] = "0";
    for (int i = strlen(b) - 1; i >= 0; --i){
        int transfer = 0; 
        char* temp;
        for (int j = strlen(a) - 1; j >= 0; --j){
            int ib = b[i] - '0'; 
            int ia = a[j] - '0';
            strcat(temp, (transfer + ib * ia) % 10 + null); 
            transfer = (transfer + ib * ia) / 10;
        }
        if (transfer != 0) strcat(temp, transfer + null);
        for (int j = 0; j < strlen(temp)/ 2; ++j){
            char buf = temp[j]; 
            temp[j] = temp[strlen(temp) - 1 - j];
            temp[strlen(temp) - 1 - j] = buf;
        }
 
        for (int j = 0; j < strlen(b) - i - 1; ++j)
            strcat(temp, null);
 
        c[30] = sum(c, temp); 
    }
    return c[30];
}
 
int main(){
    int ok;
    const int N=30;
    do {
    char a[N];
    char b[N];
    cout << "a = ";
    cin >> a;
    cout << "b = ";
    cin >> b;
    cout << "c = " << reiz(a, b) << endl;
    cout << "Continue(1) or not(0) ?" << endl;
    cin >> ok;
    } while (ok==1);
}
0
Erato
20 / 8 / 7
Регистрация: 22.10.2012
Сообщений: 76
05.12.2014, 23:02 12
проблема в блоке вычисления произведения, так как если в коде задать матрицы, то программа закрывается
0
annussaa
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 39
14.12.2014, 11:24  [ТС] 13
так, снова в n-тый раз переписанная программа, функция суммы вроде бы работает, не могу функцию умножения довести до ума.
как правильно применить сумму? например, если у меня а = 231 и b = 78, то как сделать так, чтобы массивы единиц и десятков каждый раз складывались вместе, куда нибудь откладывались и не накладывались бы один на другой и потом отложенный результат суммировался бы в итоговый?

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
#include <iostream>
#include <cstring>
using namespace std;
// sum fixed
char* sum(char *a, char *b){
    char summa[63];
    int vume = 0;
    int sk;
    int asz = strlen(a), bsz = strlen(b);
    a[61] = '\0';
    b[61] = '\0';
    summa[62] = '\0';
    while (asz>=0 || bsz>=0){
 
        if (asz>0 && bsz>0) sk = vume + a[asz-1] - '0' + b[bsz-1] - '0';
        else sk = vume;
 
        summa[asz+1] =(sk % 10 ) + '0';
 
        if (sk>9) vume = 1;
        else vume = 0;
 
        asz--;
        bsz--;
 
    }
    return summa;
}
//reiz needs fixing
char* reiz(char *a, char *b){
    char vieni[63], desmiti[63], *c, *temp;
    cin >> a >> b;
    int sk;
    int asz = strlen(a), bsz = strlen(b);
    a[30] = '\0', b[30] = '\0', c[61] = '\0', vieni[62] = '\0', desmiti[62] = '\0', temp[64] = '\0';
    int n = asz+bsz; // n = 5
    // a = 231, b = 78
    if (bsz < asz){ // 78(2) < 231(3) ? yes
        while (bsz >= 0) { // bsz >= 2
            for (int i = 0; i < n; i++) { // i = 0 ------- i = 0, 1, 2, 3, 4
                desmiti[i] = '0'; // 0 0 0 0 0
                vieni[i] = '0'; // 0 0 0 0 0
            }
            bsz--; // bsz = 1, 0
            for (int i = 1; i < bsz + asz + 1; i++){ // i = 1 -------- i = 1 + 3 + 1 (5)
                sk = (b[bsz] - '0') * (a[asz-i] - '0'); // sk = b[1] * a [2] = 1*8 = 8
                if (sk<10) { // 8 < 10
                    vieni[bsz + asz - i] = sk + '0';// vieni[1 + 3] = 8;
                    desmiti[bsz + asz - i - 1] = '0'; // desmiti [1 + 3 - 1 - 1] = '0';
                }
                else {
                    vieni[bsz + asz - i] = (sk % 10) + '0';
                    desmiti[bsz + asz - i - 1] = ((sk - sk%10)/10) + '0';
                }
                temp = sum(vieni, desmiti);
            }
        }
            if (bsz <= 2) return temp;
            else {
                char *temp2;
                strcpy(temp2, temp);
                temp = sum(c, temp2);
                return temp;
        }
    }
        /*else if (bsz > asz){ //
            while (asz >= 0) { // bsz >= 2
                asz--;
                for (int i = 0; i < n; i++) { // i = 0 ------- i = 0, 1, 2, 3, 4
                    desmiti[i] = '0'; // 0 0 0 0 0
                    vieni[i] = '0'; // 0 0 0 0 0
                }
                for (int i = 1; i < n; i++){ 
                    sk = (a[asz] - '0') * (b[bsz-i] - '0') + desmiti[n-i] - '0'; 
                    if (sk<10) {
                        vieni[n-i] = sk + '0';
                        desmiti[n-i-1] = '0';
                    }
                    else {
                        vieni[n-i] = (sk % 10) + '0';
                        desmiti[n-i-1] = ((sk - sk%10)/10) + '0';
                    }
                    temp = sum(vieni, desmiti);
                }
            }
                if (asz <= 2) return temp;
                else {
                    char *temp2;
                    strcpy(temp2, temp);
                    temp = sum(c, temp2);
                    return temp;
                }
        } */
    delete[] c;
    delete[] temp;
}
 
int main(){
    int ok;
    char a[31], b[31];
    do {
        cout << "a = ";
        cin >> a;
        cout << "b = ";
        cin >> b;
        cout << "a + b = " << sum(a, b) << endl;
 
        if (strlen(b) == 1 && b[0] == '0') cout << "Reizinasana ar nulli nav iespejama!" << endl;
        else cout << "a * b = " << reiz(a, b) << endl;
 
        cout << "Turpinat(1) vai beigt(0)?" << endl;
        cin >> ok;
    } while(ok==1);
}
0
14.12.2014, 11:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2014, 11:24

Функция находящая общие элементы двух массивов
Написать функцию, которая на основе двух динамических массивов А и В быть...

Шаблонная функция, складывающая элементы двух массивов
Как будет выглядеть протип шаблонной функции складывающей элементы двух...

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


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

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

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