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

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

Войти
Регистрация
Восстановить пароль
 
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
#1

Класс длинной арифметики - C++

11.11.2012, 14:22. Просмотров 321. Ответов 0
Метки нет (Все метки)

Я еще новичок в ООП, но недавно решил написать класс для работы с большими числами.
Вот, что получилось:
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
#include <iostream>
#include <vector>
 
using namespace std;
 
const int base=10;
class lnum
{
    vector<int> arr;
public:
    lnum operator+(lnum op2);
    lnum operator*(lnum op2);
    lnum operator/(lnum op2);
    lnum operator-(lnum op2);
    lnum(char *str)
    {
        for (int i=(int)strlen(str); i>0; i-=9)
        {
            str[i] = 0;
            arr.push_back (atoi (i>=9 ? str+i-9 : str));
        }
    }
    lnum(string str)
    {
        for (int i=(int)str.length(); i>0; i-=9)
            if (i < 9)
                arr.push_back (atoi (str.substr (0, i).c_str()));
            else
                arr.push_back (atoi (str.substr (i-9, 9).c_str()));
    }
    lnum(int num)
    {
        char str[4];
        itoa(num,str,10);
        lnum temp(str);
        arr=temp.arr;
    }
 
}
 
lnum lnum::operator*(lnum op2)
{
    int carry = 0;
    lnum c (lnum.arr.size()+op2.size());
    for (size_t i=0; i<lnum.arr.size(); ++i)
        for (int j=0, carry=0; j<(int)op2.size() || carry; ++j)
        {
            long long cur = c[i+j] + a[i] * 1ll * (j < (int)op2.size() ? op2[j] : 0) + carry;
            c[i+j] = int (cur % base);
            carry = int (cur / base);
        }
    while (c.arr.size() > 1 && c.arr.back() == 0)
        c.arr.pop_back();
    return c;
}
lnum lnum::operator/(int op2)
{
    int carry = 0;
    for (int i=(int)arr.size()-1; i>=0; --i)
    {
        long long cur = arr[i] + carry * 1ll * base;
        arr[i] = int (cur / op2);
        carry = int (cur % op2);
    }
    while (arr.size() > 1 && arr.back() == 0)
        arr.pop_back();
    return *this;
}
lnum::operator+(lnum op2)
{
    int carry = 0;
    for (size_t i=0; i<max(arr.size(),op2.arr.size()) || carry; ++i)
    {
        if (i == arr.size())
            arr.push_back (0);
        arr[i] += carry + (i < op2.arr.size() ? b[i] : 0);
        carry = arr[i] >= base;
        if (carry)
            arr[i] -= base;
    }
    return *this;
}
lnum::operator-(lnum op2)
{
    int carry = 0;
    for (size_t i=0; i<op2.arr.size() || carry; ++i)
    {
        arr[i] -= carry + (i < op2.arr.size() ? op2.arr[i] : 0);
        carry = arr[i] < 0;
        if (carry)
            arr[i] += base;
    }
    while (arr.size() > 1 && arr.back() == 0)
        arr.pop_back();
    return *this;
}
int main()
{
    lnum a("1212");
    lnum b(1);
    cout << a*b;
    return 0;
}
При компиляции возникает очень много ошибок, в т.ч. lnum is not a type, что я вообще не могу понять (ведь по идее класс создает новый тип данных).
Нужна помощь с добиванием этого кода.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2012, 14:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс длинной арифметики (C++):

Класс длинной арифметики - C++
Дайте класс длинной арифметики - хотелось бы разобраться в этой штуке, а то какие исходники не найду - то не рабочие, то еще что-то( ...

Ошибка в реализации длинной арифметики - C++
Здравствуйте. Я скопировал с e-maxx'а и объединил всё в одну программу: #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;cstdio&gt; ...

Реализация длинной целочисленной арифметики - C++
Добрый день! Возникла такая проблема: была поставлена задача реализовать детерминированный тест Миллера на простоту. С этим более-менее...

Объясните код длинной арифметики - C++
Не могу понять синтаксиса этого кода void add(vlong *op1, vlong *op2, vlong *res) { vlong *mxop, *mnop; int i, flag=0, st; mxop =...

Ищу примеры реализации длинной арифметики - C++
Здравствуйте! Скиньте пожалуйста примеры решения задач на тему &quot;Длинная арифметика&quot;! Желательно с подробным пояснением! Язык C++. Очень...

Вычислить значение суммы. Задача с использованием "длинной арифметики". - C++
Тема: «Задачи на длинную арифметику» Задача: Вычислить точное значение суммы 1^2 + 2^2 + 3^2 + ... + n^2 (n ≥ 20000). Пожалуйста,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2012, 14:22
Привет! Вот еще темы с ответами:

Выделение памяти в куче для строки для реализации длинной арифметики - C++
Доброго времени суток, пишу класс string, на основе которого потом хочу реализовать класс для длинной арифметики. Поэтому мне понадобился...

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

Что такое Особенности Адресной Арифметики? - C++
Что такое Особенности Адресной Арифметики? где-то вроде читал,что к этому относится инкрементирование...

Нюансы арифметики указателей: преобразование к char* при вычислении сдвига - C++
Добрый день! Вчера, при чтении темы возник вопрос различия между указателями и массивами. В теме дали почитать ссылку, где пишется...


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

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

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