89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
// Задание 4
|
|
// Написать программу для умножения двух больших чисел столбиком.
|
|
// Обратите внимание на количество цифр в произведении: их скорее всего
|
|
// будет больше, чем в исходных числах
|
|
|
|
#include <iostream>
|
|
|
|
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;
|
|
}
|
|
|