Перемножение двух длинных чисел - 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д