Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 7
1

Создать класс LongLong для работы с целыми числами из 64 бит - C++

22.09.2016, 21:46. Просмотров 4258. Ответов 9

Добрый вечер,вот задание: Создать класс LongLong для работы с целыми числами из 64 бит. Число должно быть представлено двумя полями: long — старшая часть, unsigned long — младшая часть. Должны быть реализованы арифметические операции, присутствующие в С++ (без присваивания), и сравнения.

Вообщем сложение и вычитание с горем пополам сделал. А в умножении столкнулся с такой проблемой что при некоторых значениях происходит переполнение переменной


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
#include <iostream>
#include <string>
 
#define MAX_SIZE  999999999 //
 
using namespace std;
 
class LongLong {
private:
    long first;
    long second; //max size = 999999999
 
public:
    LongLong() : first(0), second(0){}
    void Init(long, long);
    void Read();
    string toString();
    void Display();
    int  countOfDigits(int);
    
    void add(LongLong, LongLong);
    void sub(LongLong, LongLong);
    void mov(LongLong, LongLong);
    void div(LongLong, LongLong);
 
};
 
 
int LongLong::countOfDigits(int Num){ //Считаем к-ство цифр в числе 
 
    int count = 0;
 
    while (Num >= 1){
        Num /= 10;
        count++;
    }
 
    return count;
}
 
void LongLong::Init(long x, long y){
 
    if (y > MAX_SIZE) throw "Error!";   //Если поля больше максимального значения то ошибка
    if (x > MAX_SIZE) throw "Error!";   
    if (y < 0) throw "Error!";          //Если второе поле отрицательное то ошибка
    first = x;
    second = y;
}
 
void LongLong::Display(){
    
        cout << toString() << endl;
}
 
string LongLong::toString(){ // Первод в строку
 
    string Zeros = "";
    int countOfZeros = (9 - countOfDigits(first)) + (9 - countOfDigits(second)); //Добавляем нули неиспользованным разрядам
 
    if (first != 0){
        for (int i = 0; i < countOfZeros; i++){
 
            Zeros += "0";
        }
        return to_string(first) + Zeros + to_string(second); //Если старшая часть не равна нулю 
    }
    else return to_string(second); //Если старшая часть равна нулю 
 
}
 
void LongLong::add(LongLong l1, LongLong l2){ //Функция сложения
 
    first = l1.first + l2.first;
    second = l1.second + l2.second;
    if (second > MAX_SIZE){
        first += 1;
        second -= MAX_SIZE + 1;
    }
}
 
void LongLong::sub(LongLong l1, LongLong l2){ //Функция вычитания
    
    first = l1.first - l2.first;
    second = l1.second - l2.second;
}
 
void LongLong::mov(LongLong l1, LongLong l2){ //Функция умножения
 
    first = l1.first * l2.first;
    second = l1.second * l2.second;  //если делать так то выходит переполнение 
 
 
}
 
int main() {
 
    setlocale(LC_ALL, "RUS");
 
    LongLong l1;
    LongLong l2;
    LongLong l3;
    l1.Init(2, 120000);
    l2.Init(3, 100000);
 
    cout << "Первое число: "; l1.Display(); cout << endl;
    cout << "Второе число: "; l2.Display(); cout << endl;
    l3.add(l1, l2);
    cout << "После сложения: "; l3.Display(); cout << endl;
    l3.sub(l1, l2);
    cout << "После вычитания: "; l3.Display(); cout << endl;
    l3.mov(l1, l2);
    cout << "После умножения: "; l3.Display(); cout << endl;
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2016, 21:46
Ответы с готовыми решениями:

15. Создать класс LongLong для работы с целыми числами. Число должно быть представлено двумя полями.Реализовать арифметические операции
Добрый вечер,вот задание: Создать класс LongLong для работы с целыми числами из 64 бит. Число...

Создать класс Hex для работы с беззнаковыми целыми шестнадцатеричными числами
Создать класс Hex для работы с беззнаковыми целыми шестнадцатеричными числами, используя для...

Класс для работы с целыми числами, которые не превышают 30 десятичных цифр
Реализуйте выполнение основных арифметических операций (сложение, вычитание, умножение, деление)...

Создать односвязный список на основе вектора для работы с целыми числами
Подскажите пожалуйста как создать односвязный список на основе вектора для работы с целыми...

9
6911 / 5976 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
22.09.2016, 22:02 2
А переносы почему не учитываются? И MAX_SIZE должно быть максимальным числом для long, а не тем, что у тебя.
0
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 7
22.09.2016, 22:07  [ТС] 3
Какие переносы?
0
6911 / 5976 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
22.09.2016, 22:11 4
Ну при сложении может быть перенос из младшей части в старшую, а при вычитании - заём.
Для умножения ещё сложнее. Вспоминай как это на бумаге делается.
0
Evg
Эксперт CАвтор FAQ
21130 / 8146 / 628
Регистрация: 30.03.2009
Сообщений: 22,459
Записей в блоге: 30
22.09.2016, 22:16 5

Не по теме:

Умножение это mul, а не mov



gcc'шную реализацию можешь посмотреть тут (если разберёшься), функция называется __muldi3:
https://github.com/gcc-mirror/... /libgcc2.c
https://github.com/gcc-mirror/... /libgcc2.h
0
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 7
22.09.2016, 22:18  [ТС] 6
Ну при MAX_SIZE = 999999999 в вычитании заем не нужен. А как вы видите реализацию функции умножения?
0
Evg
Эксперт CАвтор FAQ
21130 / 8146 / 628
Регистрация: 30.03.2009
Сообщений: 22,459
Записей в блоге: 30
22.09.2016, 22:21 7
ай не... в этих online-исходниках сложно докопаться, где __umulsidi3
0
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 7
22.09.2016, 22:26  [ТС] 8
а как мне можно сделать перенос разрядов при умножении если число выползает за диапазон long
0
6911 / 5976 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
22.09.2016, 22:32 9
Цитата Сообщение от Skrip_10 Посмотреть сообщение
Ну при MAX_SIZE = 999999999 в вычитании заем не нужен
Это почему? И если у тебя настоящий int64, то не может там быть 999999999.
0
0 / 0 / 0
Регистрация: 09.12.2015
Сообщений: 7
22.09.2016, 23:00  [ТС] 10
Понял. Но меня пока интересует как реализовать умножение. Может вы подскажите на примере?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2016, 23:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Класс: создать класс Fraction для работы с дробными числами
Необходимо создать класс Fraction для работы с дробными числами. Число должно быть представлено...

Создать класс для работы с длинными числами
Помогите, пожалуйста, сделать хотя бы один из нижеперечисленных вопросов. Нужно создать класс...

Создать класс для работы с восьмеричными числами
Создать класс Octal для работы с беззнаковыми целыми восьмеричными числами, используя для...

c++ создать класс complex для работы с комплексными числами
Помогите, пожалуйста. c++ создать класс complex для работы с комплексными числами, содержащий...


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

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

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