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

Сложение столбиков двух массивов чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 02:46     Сложение столбиков двух массивов чисел #1
Например есть два массива
C++
1
2
int a[13]={2,8,3,9,4,7,5,8,6,7,3,8,2};
int b[8]={4,7,3,8,5,7,3,8};
Как мне их сложить в столбик (длинная арифметика)?

Беру остаток от деления на 10 суммы двух элементов массива и одинаковыми индексами, а как сделать перенос 1цы в следующий разряд не пойму.

C++
1
2
3
4
5
6
7
8
9
10
void sum()
{
    for(int i=0; i<max_len; i++)
    {
        s=0;
        if(a[i]+b[i]>9)
            s=1;
        c[i]=(a[i]+b[i])%10;
    }
}
Заранее спасибо за ответы!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 02:46     Сложение столбиков двух массивов чисел
Посмотрите здесь:

C++ Сложение двух чисел
C++ Сложение двух массивов.
сложение двух чисел в С C++
C++ Сложение двух массивов
C++ Сложение двух чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 03:03     Сложение столбиков двух массивов чисел #2
Сложение столбиком
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 13:50  [ТС]     Сложение столбиков двух массивов чисел #3
Цитата Сообщение от UnsKneD Посмотреть сообщение
не особо понимаю, как сказанное в этой теме реализовать на моем примере, не могли бы вы показать?

Добавлено через 25 минут
Все, разобрался.

Может кому понадобится код всей программы.

"Сложение больших чисел столбиком"

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
#include <stdlib.h>
#include <iostream>
using namespace std;
 
class bigint
{
    int a[256], b[256], c[256];
    int s, len_a, len_b, max_len;
 
public:
    bigint(int [], int [], int, int);
    void show();
    void sum();
};
 
bigint::bigint(int a[], int b[], int len_a, int len_b)
{
    s=0;
 
    bigint::len_a = len_a;
    bigint::len_b = len_b;
 
    int k;
 
    for(int i=0; i<len_a; i++)
    {
        bigint::a[i]=a[i];
    }
    for(int i=0; i<len_a/2; i++)
    {
        k=bigint::a[i];
        bigint::a[i]=bigint::a[len_a-i-1];
        bigint::a[len_a-i-1]=k;
    }
 
    for(int i=0; i<len_b; i++)
    {
        bigint::b[i]=b[i];
    }
    for(int i=0; i<len_b/2; i++)
    {
        k=bigint::b[i];
        bigint::b[i]=bigint::b[len_b-i-1];
        bigint::b[len_b-i-1]=k;
    }
 
    if(len_a<len_b)
    {
        max_len = len_b;
        for(int i=0; i<len_b-len_a; i++)
        {
            bigint::a[len_a+i]=0;
        }
    }
    if(len_b<len_a)
    {
        max_len = len_a;
        for(int i=0; i<len_a-len_b; i++)
        {
            bigint::b[len_b+i]=0;
        }
    }
}
 
void bigint::show()
{
    cout<<"Первое число = ";
    for(int i=0; i<max_len; i++)
        cout<<a[i];
    cout<<", размером в "<<len_a<<" символов"<<endl;
 
    cout<<"Второе число = ";
    for(int i=0; i<max_len; i++)
        cout<<b[i];
    cout<<", размером в "<<len_b<<" символов"<<endl;
    cout<<"Сумма = ";
    for(int i=max_len-1; i>=0; i--)
        cout<<c[i];
}
 
void bigint::sum()
{
    int i, k;
    for(k=0; k<max_len; k++)
        c[k]=0;
    for(i=max_len-1; i>=0; i--)
    {
        s=0;
        if(a[i]+b[i]>9)
        {
            s=1;
            c[i+1]+=s;
        }
        c[i]=(a[i]+b[i])%10;
    }
}
 
int main()
{
    setlocale(0, "rus");
 
    int a[13]={2,8,3,9,4,7,5,8,6,7,3,8,2};
    int b[8]={4,7,3,8,5,7,3,8};
 
    bigint str(a, b, 13, 8);
    str.sum();
    str.show();
 
    return 0;
}
Добавлено через 16 минут
Теперь не могу сделать вычитание, прошу рассказать хотя бы алгоритм, заранее спасибо!
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
21.03.2013, 15:05     Сложение столбиков двух массивов чисел #4
Вычитаете начиная с младшего разряда, если уменьшаемое меньше вычитаемого прибавляем 10 к уменьшаемому, производим вычитание, затем вычитаем единицу из вычитаемого следующего разряда и т.д.. Если заем из разряда старше вашего старшего - получили отрицательное число

Добавлено через 8 минут
И еще, вы фактически для хранения одного разряда используете 4 байта, хотя по логике вашей задачи - достаточно 1 байта (даже его половины). Почему не сделать массив unsigned char?
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 20:36  [ТС]     Сложение столбиков двух массивов чисел #5
Цитата Сообщение от vua72 Посмотреть сообщение
Вычитаете начиная с младшего разряда, если уменьшаемое меньше вычитаемого прибавляем 10 к уменьшаемому, производим вычитание, затем вычитаем единицу из вычитаемого следующего разряда и т.д.. Если заем из разряда старше вашего старшего - получили отрицательное число
спасибо за описание алгоритма, только поправочка:
...затем вычитаем единицу из вычитаемого следующего разряда и т.д..
нужно вычитать единицу из уменьшаемого следующего разряда.

Добавлено через 8 минут
И еще, вы фактически для хранения одного разряда используете 4 байта, хотя по логике вашей задачи - достаточно 1 байта (даже его половины). Почему не сделать массив unsigned char?
а по поводу этого даже не задумывался, сейчас исправлю, спасибо еще раз!

Добавлено через 1 минуту
И вдруг кому понадобиться, выкладываю код функции вычитания:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void minus()
{
    int i, k;
    for(k=0; k<max_len; k++)
        f[k]=0;
    for(i=0; i<max_len; i++)
    {
        s=0;
        if(a[i]<b[i])
        {
            a[i]+=10;
            s=1;
        }
        f[i]=a[i]-b[i];
        a[i+1]-=s;
    }
}
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 21:25  [ТС]     Сложение столбиков двух массивов чисел #6
еще вопрос: Почему например при вычитании\сложении числа, например: a[]={123456789844346} + b[]={53262354312} все считает нормально, а если ввожу a[]={999999999999999} + b[]={99999999999}

Сложение столбиков двух массивов чисел
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 21:52     Сложение столбиков двух массивов чисел #7
PlayaRC, для int максимальное значение 2 147 483 647

Добавлено через 2 минуты
если нужно складывать такие большие числа, используй long long int
http://ru.wikipedia.org/wiki/Limits.h

Добавлено через 1 минуту
C++
1
2
int a = 999999999999999;
std::cout<<a<<std::endl;
Попробуй так сделать, выдаст полную ерунду.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 21:59  [ТС]     Сложение столбиков двух массивов чисел #8
Цитата Сообщение от UnsKneD Посмотреть сообщение
PlayaRC, для int максимальное значение 2 147 483 647

Добавлено через 2 минуты
если нужно складывать такие большие числа, используй long long int
http://ru.wikipedia.org/wiki/Limits.h
так я ведь вношу числа в массив! то есть в одной ячейке максимальное число = 9
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 22:18     Сложение столбиков двух массивов чисел #9
PlayaRC, ой, точно же)
а ты функции правильные размеры массивов передаёшь?
Миниатюры
Сложение столбиков двух массивов чисел  
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 22:25  [ТС]     Сложение столбиков двух массивов чисел #10
Цитата Сообщение от UnsKneD Посмотреть сообщение
PlayaRC, ой, точно же)
а ты функции правильные размеры массивов передаёшь?
вот весь код, вроде правильные

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
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
 
class bigint
{
    int a[256], b[256], c[256], f[256], back_a[256];
    int s, len_a, len_b, max_len;
 
public:
    bigint(int [], int [], int, int);
    void show();
    void sum();
    void minus();
};
 
bigint::bigint(int a[], int b[], int len_a, int len_b)
{
    s=0;
 
    bigint::len_a = len_a;
    bigint::len_b = len_b;
 
    int k;
 
    for(int i=0; i<len_a; i++)
    {
        bigint::a[i]=a[i];
    }
    for(int i=0; i<len_a/2; i++)
    {
        k=bigint::a[i];
        bigint::a[i]=bigint::a[len_a-i-1];
        bigint::a[len_a-i-1]=k;
    }
 
    for(int i=0; i<len_b; i++)
    {
        bigint::b[i]=b[i];
    }
    for(int i=0; i<len_b/2; i++)
    {
        k=bigint::b[i];
        bigint::b[i]=bigint::b[len_b-i-1];
        bigint::b[len_b-i-1]=k;
    }
 
    if(len_a<len_b)
    {
        max_len = len_b;
        for(int i=0; i<len_b-len_a; i++)
        {
            bigint::a[len_a+i]=0;
        }
    }
    if(len_b<len_a)
    {
        max_len = len_a;
        for(int i=0; i<len_a-len_b; i++)
        {
            bigint::b[len_b+i]=0;
        }
    }
}
 
void bigint::show()
{
    cout<<"Первое число = ";
    for(int i=max_len-1; i>=0; i--)
        cout<<a[i];
    cout<<", размером в "<<len_a<<" символов"<<endl;
 
    cout<<"Второе число = ";
    for(int i=max_len-1; i>=0; i--)
        cout<<b[i];
    cout<<", размером в "<<len_b<<" символов"<<endl;
    cout<<"Сумма = ";
    for(int i=max_len-1; i>=0; i--)
        cout<<c[i];
    cout<<endl<<"Разница = ";
    for(int i=max_len-1; i>=0; i--)
        cout<<f[i];
}
 
void bigint::sum()
{
    for(int i=0; i<max_len; i++)
    {
        back_a[i]=a[i];
    }
    int i, k;
    for(k=0; k<max_len; k++)
        c[k]=0;
    for(i=0; i<max_len; i++)
    {
        s=0;
        if(a[i]+b[i]>=10)
            s=1;
        c[i]=(a[i]+b[i])%10;
        a[i+1]+=s;
    }
}
 
void bigint::minus()
{
    int i, k;
    for(k=0; k<max_len; k++)
        f[k]=0;
    for(i=0; i<max_len; i++)
    {
        s=0;
        if(back_a[i]<b[i])
        {
            back_a[i]+=10;
            s=1;
        }
        f[i]=back_a[i]-b[i];
        back_a[i+1]-=s;
    }
 
}
 
int main()
{
    setlocale(0, "rus");
 
    int n=256;
    int *a = new int[n];
    int *b = new int[n];
    char *buff=new char[n];
 
    //int a[8]={4,7,3,8,5,7,3,8};
    //int b[5]={6,5,2,7,4};
    cout<<"Введите первое число: ";
    cin.sync();
    cin.getline(buff,n);
    int a_len=strlen(buff);
    for(int i=0;i<a_len;i++)
    {
        a[i]=buff[i]-48;
        buff[i]=0;
    }
 
    cout<<"Введите второе число: ";
    cin.sync();
    cin.getline(buff,n);
    int b_len=strlen(buff);
    for(int i=0;i<b_len;i++)
    {
        b[i]=buff[i]-48;
        buff[i]=0;
    }
 
    bigint str(a, b, a_len, b_len);
    str.sum();
    str.minus();
    str.show();
 
    return 0;
}
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 22:53     Сложение столбиков двух массивов чисел #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void bigint::sum()
{
    for(int i=0; i<max_len; i++)
    {
        back_a[i]=a[i];
    }
    int i, k;
    for(k=0; k<max_len; k++)
        c[k]=0;
    for(i=0; i<max_len; i++)
    {
        s=0;
        if(a[i]+b[i]>=10)
            s=1;
        c[i]=(a[i]+b[i])%10;
        //a[i+1]+=s;
    }
}
Если закоментить последнюю строчку, то всё нормально.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 22:57  [ТС]     Сложение столбиков двух массивов чисел #12
Если закоментить последнюю строчку, то всё нормально.
не, без нее не как, это же перенос единицы в следующий разряд при a[i]+b[i]>=10.

Без нее будет не правильно считать
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 23:04     Сложение столбиков двух массивов чисел #13
PlayaRC, да я понял уже, но ошибка где то там выходит.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 23:12  [ТС]     Сложение столбиков двух массивов чисел #14
если ошибку в результате еще можно предположить, а вот почему оно даже выводиться с ошибками?
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 23:21     Сложение столбиков двух массивов чисел #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void bigint::sum() {
    int i, k; 
        for(int i=0; i<max_len; i++)
    {
        back_a[i]=a[i];
    }
    for(k=0; k<max_len; k++) 
        c[k]=0; 
    for(i=max_len-1; i>=0; i--) {
        s=0; 
        if(back_a[i]+b[i]>9) 
        { s=1; c[i+1]+=s; }
        c[i]=(back_a[i]+b[i])%10; 
    } 
}
Вот так будет правильно. Изначальный вариант функции.

Добавлено через 1 минуту
Выводится не с ошибками, выводится то что вы изменяете массив a[] в функции sum, воизбежании подобного нужно выгрузить из а во временный массив.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 23:25  [ТС]     Сложение столбиков двух массивов чисел #16
Цитата Сообщение от UnsKneD Посмотреть сообщение
Добавлено через 1 минуту
Выводится не с ошибками, выводится то что вы изменяете массив a[] в функции sum, воизбежании подобного нужно выгрузить из а во временный массив.
блин, и как я сам не увидел) спасибо огромное, все работает)
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 23:28     Сложение столбиков двух массивов чисел #17
PlayaRC, пока ковырялся, заметил что если вводить первое меньше второго то результат разности не корректен.
PlayaRC
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 23:31  [ТС]     Сложение столбиков двух массивов чисел #18
Цитата Сообщение от UnsKneD Посмотреть сообщение
PlayaRC, пока ковырялся, заметил что если вводить первое меньше второго то результат разности не корректен.
это знаю, я это еще не обработал, разность работает только для a>b
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 23:32     Сложение столбиков двух массивов чисел
Еще ссылки по теме:

C++ Сложение двух чисел в С++
Произвести сложение двух массивов 5х3 по правилам сложения матриц C++
C++ Сложение двух динамических массивов char* в одну строку

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

Или воспользуйтесь поиском по форуму:
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 23:32     Сложение столбиков двух массивов чисел #19
с числами одинаковой длины, вообще ничего не выводится.

Добавлено через 1 минуту
Цитата Сообщение от PlayaRC Посмотреть сообщение
это знаю, я это еще не обработал, разность работает только для a>b
Всё ясно)
Yandex
Объявления
21.03.2013, 23:32     Сложение столбиков двух массивов чисел
Ответ Создать тему
Опции темы

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