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

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

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

Сложение больших чисел (длинная арифметика) - C++

21.03.2013, 01:51. Просмотров 2698. Ответов 1
Метки нет (Все метки)

Есть две строки string с числами, не получается сделать их суммирование с помощь, не могу понять как сделать, помогите, пожалуйста.

Вот, что я написал:
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
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
 
class bigint
{
    string a, b, c;
    int s, len_a, len_b, max_len;
public:
    bigint(string, string);
    void show();
    void sum();
    void minus();
};
 
bigint::bigint(string a, string b)
{
    bigint::a=a;
    char k;
    for (int i=0;i<a.length()/2;i++)
    {
      k=bigint::a[i];
      bigint::a[i]=bigint::a[bigint::a.length()-i-1];
      bigint::a[a.length()-i-1]=k;
    }
 
    bigint::b=b;
    for (int i=0;i<b.length()/2;i++)
    {
      k=bigint::b[i];
      bigint::b[i]=bigint::b[bigint::b.length()-i-1];
      bigint::b[b.length()-i-1]=k;
    }
 
    len_a = a.length();
    len_b = b.length();
    s=0;
 
    if(len_a<len_b)
    {
        max_len = len_b;
        for(int i=0; i<len_b-len_a; i++)
        {
            bigint::a+="0";
        }
    }
    if(len_b<len_a)
    {
        max_len = len_a;
        for(int i=0; i<len_a-len_b; i++)
        {
            bigint::b+="0";
        }
    }
}
 
void bigint::show()
{
    cout<<"Первое число = "<<a<<", размером в "<<len_a<<" символов"<<endl;
    cout<<"Второе число = "<<b<<", размером в "<<len_b<<" символов"<<endl;
    //cout<<"Сумма = "<<c<<endl;
}
 
void bigint::sum()
{
    //Вот тут вообще не пойму что делать
    int g;
    for(int i=0; i<max_len; i++)
    {
        if((a[i]-48)+(b[i]-48)>9)
            s=1;
        c[i+1]=a[i+1]+b[i+1]+s;
        cout<<c[i];
    }
}
 
int main()
{
    setlocale(0, "rus");
 
    string a="47385738";
    string b="2839475867382";
 
    bigint str(a, b);
    str.sum();
    str.show();
 
    return 0;
}
Знаю, что нужно сделать все с помощью сложения в столбик, но не пойму как перенести 1цу в следующий разряд и еще многого другого!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 01:51     Сложение больших чисел (длинная арифметика)
Посмотрите здесь:
C++ Длинная арифметика. Сложение чисел
C++ Длинная арифметика. Перемножение двух больших чисел
C++ Длинная арифметика. Перемножение двух больших чисел. Пропуск итераций
сложение(длинная арифметика) C++
C++ Длинная арифметика. Сложение
Длинная арифметика, сумма чисел C++
C++ Длинная арифметика, деление чисел
C++ Длинная арифметика. Умножение двух длинных чисел.
Длинная арифметика, представления чисел в двоичном виде C++
Длинная арифметика(вычитание длинных целых чисел) C++
C++ Длинная арифметика: умножение двух длинных чисел
C++ Реализовать оператор сравнения в классе длинных чисел (длинная арифметика)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
21.03.2013, 18:08     Сложение больших чисел (длинная арифметика) #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
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>
using namespace std;
 
class veryLongInt
{
public:
    veryLongInt()               { strcpy(S,"0");} 
    veryLongInt(const char *A)  { strcpy(S,A);}
 
    const int Len()     const   {return strlen(S);}
    const char *Str()   const   {return S;}
 
    int *Arr() const 
    {   int *A = new int[strlen(S)];
        for(int i=0;i<strlen(S);i++)
            A[i] = S[i]-'0';
        return A;
    }
 
    veryLongInt fromArrV(int *A, int dim)
    {   int i;
        for(i=0;i<dim;i++)
            S[i] = A[i]+'0';
        S[i] = '\0';
        return *this;
    }
 
    veryLongInt & operator += (const veryLongInt & B)
    {   int *arA = this->Arr();
        int *arB = B.Arr();
        int *arC, *arLonger, *arShorter, *arC0;
        int lenLong, lenShort, mem = 0, i, dif;
 
        int lenA = this->Len();
        int lenB = B.Len();
        if(lenA>lenB)
        {   arLonger = arA;
            lenLong = lenA;
            arShorter = arB;
            lenShort = lenB;
        }
        else
        {   arLonger = arB;
            lenLong = lenB;
            arShorter = arA;
            lenShort = lenA;
        }
 
        arC = new int [lenLong+1];
        dif = lenLong - lenShort;
        for(i=lenLong;i>dif;i--)
        {   arC[i] = (arLonger[i-1]+arShorter[i-dif-1]+mem)%10;
            mem = (arLonger[i-1]+arShorter[i-dif-1]+mem)/10;
        }
        for(i=dif;i>0;i--)
        {   arC[i] = (arLonger[i-1]+mem)%10;
            mem = (arLonger[i-1]+mem)/10;
        }
        arC[0] = mem;
        if(mem)
        {   this->fromArrV(arC,lenLong+1);
        }
        else
        {   arC0 = new int[lenLong];
            for(i=0;i<lenLong;i++)
                arC0[i] = arC[i+1];
            this->fromArrV(arC0,lenLong);
        }
        return *this;
    }
    
private:
    static const int buf = 100;
    char S[buf];
};
 
 
int main()
{   veryLongInt V("123456789123456789123456789");
    veryLongInt P("987654321987654321");
    
    V += P;
    cout<<V.Str();
    
    cin.get();
    return 0;
}
Ответ Создать тему
Опции темы

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