Как задание, мне поручено написать класс, который будет реализовывать длинные числа, а также несколько функций для их обработки. Могу я поделиться своей реализацией? Вот она: <pre><code class="cpp">#include <iostream>
#include <cstdlib>
#include <vector>
int int_len(int c){
int len = 1;
while (c > 9){
c /= 10;
len ++;
}
return len;
}
int get_two_last(int & num){
int c = num%100;
num /= 100;
return c;
}
class BigInteger{
public:
int *arr;
int sign;
int len;
void change_sign(){
sign = -sign;
}
BigInteger(){
arr = (int*)calloc(1, sizeof(int));
arr[0] = 0;
sign = 1;
len = 1;
}
BigInteger(int num): BigInteger(){
len = int_len(num);
sign = num >= 0 ? 1 : -1;
arr = (int*)realloc(arr, (len/2 + 1) * sizeof(int));
for (size_t i = len/2; i >= 0; i--){
arr[i] = get_two_last(num);
}
}
~BigInteger(){
delete(arr);
}
};
int get_num_from_BigInteger(BigInteger big_int){
int len = big_int.len;
int * arr = big_int.arr;
int sign = big_int.sign;
int num = 0;
for(size_t i = 0; i < len/2 + 1; i++){
num *= 10;
num += arr[i];
}
return num * sign;
}
BigInteger pluse(BigInteger &big_int_1, BigInteger &big_int_2){
BigInteger big_int;
std::vector<int> vect;
int * array_1 = big_int_1.arr;
int len_1 = big_int_1.len / 2 + 1;
int * array_2 = big_int_2.arr / 2 + 1;
int len_2 = big_int_2.len;
int minn = len_2 < len_1 ? len_2 : len_1;
int mem = 0;
int i;
for (i = 1; i <= minn; i++){
int c = mem + array_1[len_1-i] +
Ваш код содержит несколько ошибок и недочетов, которые могут приводить к неправильному поведению. Давайте разберем основные проблемы и улучшим вашу реализацию.
1. **Использование `calloc` и `realloc`:** В вашем конструкторе вы используете `calloc` для начальной инициализации массива, а затем `realloc` - это может привести к потерям данных, если `realloc` не может уменьшить размер массива, и новый размер больше, чем старый. Лучше использовать стандартный контейнер, например, `std::vector`.
2. **Неправильный способ заполнения массива:** Ваша логика заполнения массива в конструкторе класса `BigInteger` некорректна. Функция `get_two_last(num)` не изменяет значение `num` таким образом, как вы ожидаете. В результате массив может содержать неправильные значения.
3. **Уничтожение массива в деструкторе:** Вместо `delete(arr)`, который вызывается для указателей, вам нужно использовать `free(arr)`, так как вы выделяли память с помощью `calloc` или `malloc`.
4. **Некорректные операции со знаками и длинный int:** Если переданное число слишком велико для типа `int`, это может привести к потере значений.
5. **Проблемы с доступом к элементам массива:** Использование неверного индекса для доступа к элементам массива может привести к ошибкам в расчете.
Вот исправленная версия вашего кода:
```cpp
#include <iostream>
#include <vector>
class BigInteger {
public:
std::vector<int> arr; // Используем vector для удобства
int sign;
// Конструктор по умолчанию
BigInteger() : arr(1, 0), sign(1) {}
// Конструктор с параметром
BigInteger(int num) : BigInteger() {
if (num < 0) {
sign = -1;
num = -num; // Работаем с положительным числом
} else {
sign = 1;
}
while (num > 0) {
arr.push_back(num % 100); // Храним по 2 цифры
num /= 100;
}
}
// Печать числа в удобном формате
void print() const {
if (sign == -1) std::cout << '-';
for (size_t i = arr.size(); i > 0; --i) {
std::cout << (arr[i-1] < 10 ? "0" : "") << arr[i-1]; // Форматируем вывод
}
if (arr.size() == 1 && arr[0] == 0) {
std::cout << '0'; // Если число равно нулю
}
std::cout << std::endl;
}
};
int main() {
BigInteger bigInt(123456);
bigInt.print(); // Ожидаемый вывод: 123456
BigInteger bigIntNeg(-123456);
bigIntNeg.print(); // Ожидаемый вывод: -123456
return 0;
}
```
В данном примере:
- Мы используем `std::vector`, чтобы управлять массивом чисел.
- Переписываем логику инициализации, так что все числа, включая отрицательные, обрабатываются корректно.
- Реализуем вспомогательную функцию `print` для представления числа в читаемом виде.
Постарайтесь следовать этим рекомендациям и использовать возможности стандартной библиотеки C++ для упрощения кода и управления памятью.
Здравствуйте. У вас множество логических ошибок, рекомендую запустить под отладчиком и идти по шагам, разбираясь, что идёт не так. Без этого такой код Вы, боюсь, не запустите. Первое место, где выполнение идёт не так - в функции int_len(), которая для вычисления количества цифр проверяет текущее значение на '>9', хотя оно изначально отрицательно. Скорее всего, сюда уже модуль числа должен приходить. Дальше тоже есть ошибки, которые нужно исправлять по одной.
Ещё очень резануло глаз, что у Вас класс работает с динамической памятью, но не имеет копирующих/перемещающих конструкторов и операторов ++ (почитайте). В таком виде это нормально работать не будет - либо добавьте нужные конструкторы/операторы, либо не используйте вручную динамическую память (заверните в vector).