diff --git a/task4.cpp b/task4.cpp new file mode 100644 index 0000000..a442414 --- /dev/null +++ b/task4.cpp @@ -0,0 +1,88 @@ +// Задание 4 +// Написать программу для умножения двух больших чисел столбиком. +// Обратите внимание на количество цифр в произведении: их скорее всего +// будет больше, чем в исходных числах + +#include + +void printArray(int* arr, int size) +{ + // Печать массива, пропуская ведущие нули + bool leadingZero = true; + for (int i = 0; i < size; i++) + { + if (arr[i] != 0) + { + leadingZero = false; + } + if (!leadingZero) + { + std::cout << arr[i]; + } + } + if (leadingZero) + { + std::cout << "0"; // Если все нули + } + std::cout << std::endl; +} + +int* multiplyDecimal(int* A, int sizeA, int* B, int sizeB, int& resultSize) +{ + resultSize = sizeA + sizeB; // Максимально возможный размер результата + int* result = new int[resultSize](); // Инициализируем массив нулями + + // Умножаем каждую цифру первого числа на каждую цифру второго числа + for (int i = sizeA - 1; i >= 0; i--) + { + for (int j = sizeB - 1; j >= 0; j--) + { + int product = A[i] * B[j]; + int sum = product + result[i + j + 1]; // Добавляем к текущему разряду результата + + result[i + j + 1] = sum % 10; // Текущий разряд + result[i + j] += sum / 10; // Перенос + } + } + return result; +} + +int main() +{ + std::setlocale(LC_ALL, "ru"); + + int sizeA, sizeB; + std::cout << "Введите длину первого числа: "; + std::cin >> sizeA; + int* A = new int[sizeA]; + + std::cout << "Введите первое число (цифры от 0 до 9): "; + for (int i = 0; i < sizeA; i++) + { + std::cin >> A[i]; + } + + std::cout << "Введите длину второго числа: "; + std::cin >> sizeB; + int* B = new int[sizeB]; + + std::cout << "Введите второе число (цифры от 0 до 9): "; + for (int i = 0; i < sizeB; i++) + { + std::cin >> B[i]; + } + + int resultSize; + int* result = multiplyDecimal(A, sizeA, B, sizeB, resultSize); + + std::cout << "Результат умножения: "; + printArray(result, resultSize); + + // Освобождаем память + delete[] A; + delete[] B; + delete[] result; + + return 0; +} +