Files
ARPZ-s1-pr3/task1.cpp

165 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Задание 1
// Написать программу для сложения и вычитания двух больших чисел в
// столбик. Для представления чисел использовать массив, в котором будут
// храниться цифры числа. При реализации процедуры вычитания
// предпочтительно из большего вычитать меньшее. Для этого
// первоначально определять, какое из двух чисел больше
#include <iostream>
int compare(int *a, int *b, int size)
{
// Сравнение чисел
// a - первое число
// b - второе число
// size - длина числа
for (int i = 0; i < size; i++)
{
if (a[i] > b[i])
{
return 1; // a > b
}
else if (a[i] < b[i])
{
return -1; // a < b
}
}
return 0; // a равно b
}
int* sum(int *A, int* B, int size)
{
// Сложение чисел
// a - первое число
// b - второе число
// size - длина числа
int *a = new int[size]();
int *b = new int[size]();
for (int i = 0; i < size; i++) {
a[i] = A[i];
b[i] = B[i];
}
// Инициализируем массив для хранения результирующего числа с длиной size
// ************************************************************************
// *ВНИМАНИЕ! Скобки на конце инициализируют массив нулями! ЭТО ВАЖНО!
// *В Windows массив может изначально содержать биты, неочищенные из памяти
// *после работы других программ, что приведет непредвиденным последствиям!
// ************************************************************************
int *result = new int[size]();
// Выполняем поразрядное сложение
for (int i = size - 1; i >= 0; i--)
{
int sum = a[i] + b[i];
result[i] = sum % 10; // Помещаем то, что оказалось меньше 10, в текущий разряд
if(i - 1 >= 0 && sum >= 10) // Избегаем вставку в следующий разряд при переполнении
{
b[i - 1] = b[i - 1] + sum / 10; // Помещаем то, что оказалось больше 10, в следующий разряд
}
}
// Очищаем память от временных массивов
delete[] a;
delete[] b;
// Возвращаем результирующий массив
return result;
}
int* subtract(int *A, int *B, int size)
{
int *a = new int[size]();
int *b = new int[size]();
for (int i = 0; i < size; i++)
{
a[i] = A[i];
b[i] = B[i];
}
int *result = new int[size]();
// Проверяем, какое из двух чисел больше
if (compare(a, b, size) == -1)
{
int *temp = a;
a = b;
b = temp;
}
// Выполняем поразрядное вычитание
for (int i = size - 1; i >= 0; i--)
{
if (a[i] < b[i])
{
// Если текущий разряд a меньше b, нужно занять 1 из следующего разряда
a[i - 1]--; // Уменьшаем следующий разряд
result[i] = a[i] + 10 - b[i]; // Добавляем 10 к текущему разряду и вычитаем b
}
else
{
result[i] = a[i] - b[i]; // Обычное вычитание
}
}
// Очищаем память от временных массивов
delete[] a;
delete[] b;
return result;
}
int main()
{
std::setlocale(LC_ALL, "ru");
int size;
int *a;
int *b;
std::cout << "Максимально предусматриваемая длина числа: ";
std::cin >> size;
// Инициализируем массивы чисел. Все элементы аналогично инициализируем нулями
a = new int[size]();
b = new int[size]();
std::cout << "Введите первое число: ";
for (int i = 0; i < size; i++)
{
std::cin >> a[i];
}
std::cout << "Введите второе число: ";
for (int i = 0; i < size; i++)
{
std::cin >> b[i];
}
int *resultSum = sum(a, b, size);
int *resultSub = subtract(a, b, size);
std::cout << "Результат сложения: ";
for (int i = 0; i < size; i++)
{
std::cout << resultSum[i] << " ";
}
std::cout << std::endl;
std::cout << "Результат вычитания: ";
for (int i = 0; i < size; i++)
{
std::cout << resultSub[i] << " ";
}
std::cout << std::endl;
return 0;
}