Перемножение двух длинных чисел - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, подскажите пожалуйста, каким образом можно перемножить два длинных числа (от 30 символов в каждом) и получить целочисленный результат? Не прибегая при этом к BigInteger? Я так понимаю можно умножать в столбик, но как это реализовать?

Решение задачи: «Перемножение двух длинных чисел»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace BigNumbers
{
    public class BigNumber
    {
        int[] firstNumber;
        int[] secondNumber;
        int[] resultNumber;
 
        public BigNumber()
        {
            //константы для случайной генерации размеров массивов
            const int from = 10000; //10 000
            const int to =  100000;//100 000
 
            Random rand = new Random();
            int firstNumberSize = rand.Next(from, to);
            int secondNumberSize = rand.Next(from, to);
 
            //получаем максимальный размер массива
            int maxSize = Math.Max(firstNumberSize, secondNumberSize);
 
            this.firstNumber = new int[maxSize];
            this.secondNumber = new int[maxSize];
 
            //инициализируем массивы случайными числами
            for (int i = 0; i < firstNumberSize; i++)
            {
                firstNumber[i] = rand.Next(0, 9);
            }
 
            for (int i = 0; i < secondNumberSize; i++)
            {
                secondNumber[i] = rand.Next(0, 9);
            }
        }
 
        public int[] FirstNumberValue
        {
            get { return this.firstNumber; }
        }
 
        public int[] SecondNumberValue
        {
            get { return this.secondNumber; }
        }
 
        public int[] AdditionResult
        {
            get { return this.resultNumber; }
 
        }
 
        /// <summary>
        /// метод для записи результата сложения двух длинных чисел в текстовый файл
        /// </summary>
        public void AdditionResultTxt()
        {
            StreamWriter sw = new StreamWriter("addition_result.txt");
            sw.WriteLine("The result of addition of {0}-digit numbers", firstNumber.Length);
 
            for (int i = resultNumber.Length-1; i >= 0; i--)
            {
                sw.Write(resultNumber[i]);
            }
            sw.Close();
        }
 
        /// <summary>
        /// метод для сложения двух длинных чисел
        /// </summary>
        public void AddNumbers()
        {
            int lastNumber = 0; // последнее число в массиве (первое в числе)
 
           //массивы все приведены к одинаковой длине, складываем столбиком
           for (int i = 0; i < firstNumber.Length; i++)
            {
               //если сумма цифр не больше десяти
                if (firstNumber[i] + secondNumber[i] < 10)
                {
                    //складываем их без проблем
                    firstNumber[i] += secondNumber[i];
                }
                
                //если мы получили двузначное число (10, 12, 17)
                else 
                {
                    //смотрим, не последний ли элемент массива, в котором получилась такая сумма
                    //если не последний, то...
                    if (i + 1 < firstNumber.Length)
                    {
                        //сохраняем в нем младший разряд числа (было 12 - останется 2, было 18 - останется 8)
                        firstNumber[i] = firstNumber[i] + secondNumber[i] - 10;
 
                        //в следующий элемент массива переносим запомненный разряд, т.е. единицу
                        firstNumber[i + 1] += 1;
                    }
 
                    //если мы в последнем элементе массива, то нам нужно работать только с ним, следующего ведь нет
                    else
                    {
                        //складываем элементы массивов
                        if (firstNumber[i] + secondNumber[i] < 10)
                        {
                            firstNumber[i] = firstNumber[i] + secondNumber[i];
                        }
                        else 
                        {
                            firstNumber[i] = firstNumber[i] + secondNumber[i] - 10;
                            lastNumber = 1;
                        }
 
                    }
                }
            }
 
            //сохраняем результат
           SetResult(lastNumber);
        }
 
        /// <summary>
        /// метод для инициализации массива с результатом сложения
        /// </summary>
        private void SetResult( int lastNumber)
        {
            switch (lastNumber)
            { 
                case 0:
                    this.resultNumber = firstNumber;
                    break;
 
                case 1:
                    resultNumber = new int[firstNumber.Length + 1];
                    resultNumber[firstNumber.Length] = lastNumber;
 
                    for (int i = 0; i < firstNumber.Length; i++)
                    {
                        resultNumber[i] = firstNumber[i];
                    }
                    break;
            }
        }
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            
            BigNumber bg = new BigNumber();
            bg.AddNumbers();
            bg.AdditionResultTxt();
 
            Console.WriteLine("The result of addition was successfully written in 'addition_result.txt'");
            Console.ReadKey();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы