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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
#1

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

21.03.2013, 02:46. Просмотров 1333. Ответов 18
Метки нет (Все метки)

Например есть два массива
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;
    }
}
Заранее спасибо за ответы!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 02:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложение столбиков двух массивов чисел (C++):

Сложение двух массивов. - C++
Что то я не как не пойму если я пишу вот такой код #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; int aaa = {2,3,4}, bbb = {5,6,7}, ...

Сложение двух массивов - C++
Вот условие задачи: Your friend is the person who does not like any limitations in the life. And when you said to him that it is totally...

Сложение двух динамических массивов char* в одну строку - C++
В массивы вводятся данные, масcивы вида : int n,k; char *a,*b; a=new char; b=new char; Как вывести результирующую...

Произвести сложение двух массивов 5х3 по правилам сложения матриц - C++
Произвести сложение двух массивов 5х3 по правилам сложения матриц. Не могу решить помогите с решением. Зарание спасибо. :)

Вычислить сумму двух длинных бинарных чисел, используя сложение чисел в двоичной системе счисления - C++
Задано положительное и отрицательное число в двоичной системе.Составить программу вычисления суммы этих чисел, используя сложения чисел в...

Сложение двух чисел - C++
P.S Код должен выполнять аналогию сложения двух числе в столбик. Добавлено через 34 секунды

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 03:03 #2
Сложение столбиком
1
PlayaRC
5 / 5 / 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 минут
Теперь не могу сделать вычитание, прошу рассказать хотя бы алгоритм, заранее спасибо!
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
21.03.2013, 15:05 #4
Вычитаете начиная с младшего разряда, если уменьшаемое меньше вычитаемого прибавляем 10 к уменьшаемому, производим вычитание, затем вычитаем единицу из вычитаемого следующего разряда и т.д.. Если заем из разряда старше вашего старшего - получили отрицательное число

Добавлено через 8 минут
И еще, вы фактически для хранения одного разряда используете 4 байта, хотя по логике вашей задачи - достаточно 1 байта (даже его половины). Почему не сделать массив unsigned char?
1
PlayaRC
5 / 5 / 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;
    }
}
0
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 21:25  [ТС] #6
еще вопрос: Почему например при вычитании\сложении числа, например: a[]={123456789844346} + b[]={53262354312} все считает нормально, а если ввожу a[]={999999999999999} + b[]={99999999999}

Сложение столбиков двух массивов чисел
0
UnsKneD
алкокодер
154 / 150 / 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;
Попробуй так сделать, выдаст полную ерунду.
1
PlayaRC
5 / 5 / 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
0
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 22:18 #9
PlayaRC, ой, точно же)
а ты функции правильные размеры массивов передаёшь?
1
Миниатюры
Сложение столбиков двух массивов чисел  
PlayaRC
5 / 5 / 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;
}
0
UnsKneD
алкокодер
154 / 150 / 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;
    }
}
Если закоментить последнюю строчку, то всё нормально.
1
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 22:57  [ТС] #12
Если закоментить последнюю строчку, то всё нормально.
не, без нее не как, это же перенос единицы в следующий разряд при a[i]+b[i]>=10.

Без нее будет не правильно считать
0
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.03.2013, 23:04 #13
PlayaRC, да я понял уже, но ошибка где то там выходит.
1
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
21.03.2013, 23:12  [ТС] #14
если ошибку в результате еще можно предположить, а вот почему оно даже выводиться с ошибками?
0
UnsKneD
алкокодер
154 / 150 / 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, воизбежании подобного нужно выгрузить из а во временный массив.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 23:21
Привет! Вот еще темы с ответами:

Сложение двух чисел - C++
Условие задачи в её названии. Я так понимаю тут длинная арифметика. Во входном файле два целых неотрицательных числа A и B (A, B ≤...

Сложение двух чисел - C++
Сложение двух чисел. Как, если оба числа в диапазоне от 0 до 2*10^9 ? Если складывать 2*10^9 + 2*10^9 то long int не справляется((

Сложение двух чисел - C++
Написать программу сложения двух чисел на Visual c++. Вот мой код. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; ...

Сложение двух чисел на TurboC++ - C++
Всем привет! Подскажите, в чем ошибка с переменной с? Вот скрины - Коды программ надо переписывать в тему!


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.03.2013, 23:21
Ответ Создать тему
Опции темы

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