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

Реализовать длинные целые числа в виде класс - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
06.12.2013, 11:17     Реализовать длинные целые числа в виде класс #1
здравствуйте,только начала изучение классов,помогите с решением задачи:нужно реализовать длинные целые числа в виде класса с конструктором и деструктором,перегрузить ввод,вывод и сумму.Вот что у меня выходит,пока без перегрузок:
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
#include <iostream>
 
Class Maxint
{
public:
    long int nd;//число
    Maxint();//конструктор
    Maxint(Maxint & x);//конструктор копирования
    Maxint(long int n);
    ~Maxint();//деструктор
    void set_nd(long int n);
    void get_nd();
    void read();//ввод с клавиатуры
    void write();//вывод на экран
    Maxint Sum(Maxint & b);//сумма
};
 
Maxint::Maxint()
{
    nd=0;
}
 
Maxint::Maxint(Maxint & x)
{
    nd=x.get_nd();
}
 
Maxint::Maxint(long int n)
{
    nd=n;
}
 
Maxint::~Maxint()
{
}
 
void Maxint::set_nd(long int n)
{
    nd=n;
    return;
}
 
int Maxint::get_nd()
{
    return nd;
}
 
Void Maxint::read()
{
    int k;
    cout<<"введите количество длинных чисел"<<endl;
    for (int i=0;i<k;i++)
        cin>>nd;
    return;
}
 
void Maxint::write()
{
    cout<<nd;
    return;
}
 
 
Maxint Maxint::Sum(Maxint & b)
{
    Maxint s ();
        return s;
}
 
void main()
{
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 11:17     Реализовать длинные целые числа в виде класс
Посмотрите здесь:

Класс Hugeint (целые числа) Операции: - =, сравнение(<, >) C++
C++ Реализовать односвязный список, элементы которого содержат целые числа
В возростающем порядке напечатать все целые числа из диапазона от 1 до 1000000 которые отображаються в виде k=n^2+m^2,m>0,n>0 C++
C++ Создать класс, который запоминает целые восьмеричные числа в виде строк
C++ Длинные целые числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.12.2013, 11:31     Реализовать длинные целые числа в виде класс #2
скорее надо немного не так делать, как мне кажется тут имелись ввиду бесконечно длинныечисла, т.е. надо использовать строку для передачи числа и для выполнения над ним операций.
А под перегрузкой операций понимается след конструкция
C++
1
2
3
4
5
6
7
8
9
10
Maxint& Maxint::operator+(const Maxint& obj)
{
a=a+obj.a;
b=b+obj.b;
return *this;
}
istream& operator<<(istream& i, const Maxint& obj) // friend  в прототипе
{
std::i<<a<<std::i<<b;
}
я мб накосячил в чём-то надо повторить самому дома будет
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
06.12.2013, 11:35  [ТС]     Реализовать длинные целые числа в виде класс #3
а это что такое istream& operator<<(istream& i, const Maxint& obj) // friend в прототипе
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.12.2013, 11:51     Реализовать длинные целые числа в виде класс #4
Цитата Сообщение от fkty Посмотреть сообщение
а это что такое istream& operator<<(istream& i, const Maxint& obj) // friend в прототипе
ну лучше почитайте про перегрузку операций...

Это дружественная ( значит что она имеет доступ к закрытым переменным класса...слово friend в прототипе) функция возвращает ссылку на объект класса istream (istream/ostream - объекты для ввода и вывода, это теже самые cin>> и cout<<)
лучше почитайте, я сам не особо помню и не хчоу врать
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
07.12.2013, 10:57  [ТС]     Реализовать длинные целые числа в виде класс #5
dzrkot, а как тогда сделать с бесконечно длинными числами?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
07.12.2013, 12:27     Реализовать длинные целые числа в виде класс #6
ну конструктор принимает строку просто вместо числа, эта задача не нова и есть на форуме, и мне её решать честно говоря лень, мб вечером созрею)) вопросы конкретные если будут - обращайся
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
07.12.2013, 12:31  [ТС]     Реализовать длинные целые числа в виде класс #7
хорошо,посмотрю на форуме похожие задачки...и подожду созревания=)
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
11.12.2013, 16:17  [ТС]     Реализовать длинные целые числа в виде класс #8
вот почти сделала,помогите пожалуйста доделать..
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
#include <conio.h>
#include <iostream>
using namespace std;
class BigInt {
public:
// к этим членам можно закрыть доступ
long Size, SizeMax; // Size – текущая длина
                    // SizeMax – максимальная длина
short *Coef; // Массив коэффициентов
 long n;           
BigInt();
virtual ~BigInt();
void zero(); // Обнулить число
void update();
void read ();//ввод с клавиатуры
void write ();//вывод на экран
 
 
};
 
BigInt::BigInt() 
{
    SizeMax = Size = 0; // Объявление вида BigInt A;
    Coef = 0; // Создается полностью пустое число
}
BigInt::~BigInt() 
{
    delete Coef;
}
void BigInt::zero() 
{ // A.zero() – обнулить число
    for(long i=0; i<SizeMax; i++) Coef[i]=0;
    Size=1;
}
 
 
 
// Вычисление C = A+B, работает вызов вида Add (A, B, A).
// максимальный размер C должен быть достаточен для хранения суммы
void Add(const BigInt &A, const BigInt &B, BigInt &C) 
{
    long i;
    long temp; // temp здесь и далее играет роль “временной” цифры,до выполнения переноса. Возможно, temp > BASE.
// для быстрого доступа к коэффициентам объявляются временные указатели a,b,c.
    const short *a=A.Coef, *b=B.Coef;
    short *c=C.Coef, carry = 0;
    int BASE=10;
// Добиваемся B.Size ≤ A.Size.
if ( A.Size < B.Size ) 
{
    Add(B,A,C);
    return;
}
// Теперь B.Size ≤ A.Size.
// Складываем два числа, i - номер текущей цифры
for (i=0; i<B.Size; i++) 
{
    temp = a[i] + b[i] + carry;
    if (temp >= BASE) 
    { // переполнение. Перенести единицу.
        c[i] = temp - BASE;
        carry = 1;
    } 
    else 
    {
        c[i] = temp;
        carry = 0;
    }
}
// Меньшее число кончилось
for (i=0; i < A.Size; i++) 
{
    temp = a[i] + carry;
    if (temp >= BASE) 
    {
        c[i] = temp - BASE;
        carry = 1;
    } 
    else 
    {
        c[i] = temp;
        carry = 0;
    }
}
// Если остался перенос – добавить его в дополнительный разряд
if (carry) 
{
    c[i] = carry;
    C.Size = A.Size+1;
}
else C.Size = A.Size;
}
 
void BigInt::read()
{
    cin>>n;
    return;
}
 
void BigInt::write()
{
    cout<<n;
    return;
}
 
void main ()
{
 
    BigInt Z;
    cout<<"введите длинное число"<<endl;
        Z.read();
 
    getch();
    return;
}
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
11.12.2013, 16:28     Реализовать длинные целые числа в виде класс #9
http://e-maxx.ru/algo/big_integer вот о чем речь.
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
20.12.2013, 18:21  [ТС]     Реализовать длинные целые числа в виде класс #10
помогите пожалуйста доделать задачу,если знаки чисел разные...
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#include <iostream>
#include <cstring>
#include <conio.h>
using namespace std;
 
#define     DEFAULT_LEN     32
 
class CLongInt
{
    char * m_Digit;     // последовательность цифр в формате little-endian (по младшему адресу - младший байт)
    int m_Len;          // длина числа в байтах
    int m_Sign;         // знак числа (0 = полож. число, -1 = отриц. число)
 
public:
    CLongInt();
    CLongInt(int _len);
    CLongInt(const char *_digit);
    ~CLongInt();
    CLongInt::CLongInt(const CLongInt &_src);
    CLongInt operator+(const CLongInt &_b);
    friend ostream &operator<<(ostream &_stream, const CLongInt &_a);
 
    int g_Len() const { return m_Len; };
};
 
 
//
//  Дефолтный конструктор
//
CLongInt::CLongInt()
{
    m_Len = DEFAULT_LEN;                // дефолтная длина длинного числа
    m_Digit = new char[DEFAULT_LEN];    // память для хранения числа
    m_Sign = 0;                         // знак числа по умолчанию
}
CLongInt::CLongInt(const CLongInt &_src)
{
    m_Len = _src.m_Len;
    m_Digit = new char[m_Len];
    strncpy(m_Digit, _src.m_Digit, m_Len);
    m_Sign = _src.m_Sign;
}
 
 
//
//  Конструктор для выделения памяти без инициализации
//
CLongInt::CLongInt(int _len)
{
    m_Len = _len;
    m_Digit = new char[_len];
    m_Sign = 0;
}
 
 
//
//  Основной конструктор
//
//  _digit - строковое представление длинного целого (со знаком или без)
//
CLongInt::CLongInt(const char *_digit)
{
    // индекс старшей цифры в переданном аргументе
    int src_index = 0;  // предполагаемое значение (если не указан знак)
 
    // проверим, указан ли знак числа в начале строки
    if (_digit[0] == '-')
    {
        m_Sign = -1;
        src_index = 1;
    }
    else
    {
        m_Sign = 0;
        if (_digit[0] == '+')
        {
            src_index = 1;
        }
    }
 
    m_Len = strlen(_digit) - src_index; // получаем длину числа в байтах
    m_Digit = new char[m_Len];          // резервируем память для хранения числа
 
 
    // индекс старшей цифры получаемого числа
    int dest_index = m_Len - 1;
 
    // преобразуем переданную строку в выбранный формат хранения длинного целого числа
    while (_digit[src_index] != 0)
    {
        m_Digit[dest_index] = _digit[src_index] - '0';  // преобразование типа '0' -> 0, '1' -> 1 и т.д.
 
        src_index++;
        dest_index--;
    }
 
}
 
//
//  Деструктор
//
CLongInt::~CLongInt()
{
    delete m_Digit;
}
 
 
//
//  Вывод длинного целого числа в поток
//
ostream &
operator<<(ostream &_stream, const CLongInt &_a)
{
    if (_a.m_Sign == -1)
        _stream << '-';
 
    for(int i = _a.m_Len - 1; i >= 0; i--)
    {
        _stream << (char)(_a.m_Digit[i] + '0');
    }
    return _stream;
}
 
 
 
CLongInt
CLongInt::operator+(const CLongInt &_b)
{
    // длина самого длинного из двух чисел
    int max_len = ((m_Len > _b.m_Len) ? m_Len : _b.m_Len);
 
    // реальная длина результата
    int res_len;
 
    // знак результата
    int res_sign;
 
    // создаем буфер
    char *buff = new char[max_len + 1];
 
    // если знаки чисел одинаковы
    if (m_Sign == _b.m_Sign)
    {
        // просто складываем числа
        int i = 0;      // индекс текущей складываемой цифры
        int carry = 0;  // признак переноса в старший разряд
        int a, b, c;
        do
        {
            // текущая цифра первого слагаемого
            if (i < m_Len)
                a = m_Digit[i];
            else
                a = 0;
 
            // текущая цифра второго слагаемого
            if (i < _b.m_Len)
                b = _b.m_Digit[i];
            else
                b = 0;
 
            // складываем с учетом возможного переноса ранее
            c = a + b + carry;
 
            // результат превышает максим. значение одной цифры
            if (c > 9)
            {
                c = c - 10;
                carry = 1;
            }
            else
            {
                carry = 0;
            }
 
            // сохраняем в буфере полученную цифру
            buff[i] = c;
 
            i++;
        }
        while(i < max_len);
 
        if (carry)
        {
            buff[i] = 1;
            res_len = max_len + 1;
        }
        else
        {
            res_len = max_len;
        }
 
        res_sign = m_Sign;
    }
    else
    {
        // будем вычитать
    }
 
    CLongInt a(res_len);
    for(int i = 0; i < res_len; i++)
        a.m_Digit[i] = buff[i];
 
    a.m_Sign = res_sign;
    delete buff;
    return a;
}
 
 
int main()
{
    CLongInt a("555");
    cout << a << " " << a.g_Len() << endl;
 
    CLongInt b("222");
    cout << b << " " << b.g_Len() << endl;
 
    cout << (a+b) << endl;
    getch();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 17:37     Реализовать длинные целые числа в виде класс
Еще ссылки по теме:

Реализовать класс MyQueue, позволяющий хранить данные любого типа в виде очереди C++
Класс "Длинные числа" с перегрузкой операторов C++
Класс "длинные числа" C++

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

Или воспользуйтесь поиском по форуму:
fkty
1 / 1 / 0
Регистрация: 06.01.2013
Сообщений: 265
23.12.2013, 17:37  [ТС]     Реализовать длинные целые числа в виде класс #11
Никто не сможет помочь?
Yandex
Объявления
23.12.2013, 17:37     Реализовать длинные целые числа в виде класс
Ответ Создать тему
Опции темы

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