-2

Решил написать программу для сложения больших чисел с использованием длинной арифметики, но Visual Studio выдаёт ошибку:

Индекс находился вне границ массива.

Как решить данную проблему, чтобы программа работала корректно.

using System;
namespace LongArithmetic
{
    class Program
    {
        static void Main(string[] args)
        {
            string LongStr1, LongStr2;
            int length;
            Console.WriteLine("Ведите число 1: ");
            LongStr1=Console.ReadLine();
            Console.WriteLine("Ведите число 2: ");
            LongStr2=Console.ReadLine();
            int[] LongAr1= new int [LongStr1.Length];
            int[] LongAr2 = new int[LongStr2.Length];
            for (int i=0; i<LongStr1.Length; i++)
                {
                LongAr1[i]=int.Parse(LongStr1[i].ToString());
                }
            for (int i = 0; i < LongStr2.Length; i++)
                {
                LongAr2[i] = int.Parse(LongStr2[i].ToString());
                }
            Array.Reverse(LongAr1);
            Array.Reverse(LongAr2);
            if (LongAr1.Length > LongAr2.Length)
                length = LongAr1.Length;
            else
                length = LongAr2.Length;
            for (int i = 0; i < length; i++)
            {
                LongAr2[i] += LongAr1[i]; // суммируем последние разряды чисел
                LongAr2[i + 1] += (LongAr2[i] / 10); // если есть разряд для переноса, переносим его в следующий разряд
                LongAr2[i] %= 10; // если есть разряд для переноса он отсекается
            }
            Array.Reverse(LongAr2);
            for (int i = 0; i < LongAr2.Length; i++)
            {
                Console.Write(LongAr2[i]);
            }
            Console.ReadKey();
        }
    }
}
  • Выход за границы массива в for (int i = 0; i < length; i++), числа могут быть разной длины, а счетчик i у вас один на оба числа. – eanmos Sep 09 '17 at 17:17
  • longArr2[i+1] заграницу уходит вероятно на последней итерации – teran Sep 09 '17 at 17:17
  • @Eanmos дак там же определяется минимальная длина до этого – teran Sep 09 '17 at 17:18
  • 1
    я, честно говоря, не понимаю в чем сложность отладки то? – teran Sep 09 '17 at 17:19
  • @teran, по-моему, там определяется максимальная длина) – eanmos Sep 09 '17 at 17:19
  • Там определяется максимальная длина – Неуловимый Джо Sep 09 '17 at 17:20
  • хах, действительно – teran Sep 09 '17 at 17:20
  • Но если числа одинаковой длины всё равно выходит та же ошибка – Неуловимый Джо Sep 09 '17 at 17:21
  • Ну так teran же написал: longArr2[i+1] заграницу уходит вероятно на последней итерации – eanmos Sep 09 '17 at 17:28
  • 1
  • и только не говорите мне, что нельзя закрыть таким дубликатом :) – Алексей Шиманский Sep 09 '17 at 17:47
  • @АлексейШиманский конечно нельзя, это же вопрос у которого в качестве ответа можно оставить целый пример написания кода для длинной арифметики. И упомянуть ошибку того, что итоговый массив значения должен быть на единицу больше для сложения. Ну это если конечно тут есть у кого-то желание получить плюсиков в свою карму. – Alex Krass Sep 09 '17 at 17:52
  • @AlexKrass у меня просто сложилось впечатление, что автору вопроса хочется просто починить данную ошибку и всё. – Алексей Шиманский Sep 09 '17 at 17:54
  • @АлексейШиманский так и есть, но это же не значит, что мы не может использовать вопрос с таким замечательным заголовком в своих корыстных целях ;-) Ну если конечно желающих написать ответ не будет, то можно и закрыть через пару дней. – Alex Krass Sep 09 '17 at 17:56
  • @AlexKrass блин, я щас отзову голос, а переголосовать будет уже нельзя :( ну ладно, творите – Алексей Шиманский Sep 09 '17 at 18:04

2 Answers2

1
int[] longAr1 = new int[longStr1.length+1];

для longAr2 аналогично

0

Всё работает,но есть одно "но" 1-е число должно быть больше 2-го.

using System;
using System.Collections.Generic;
namespace LongArithmetic
{
    class Program
    {
        static void Main(string[] args)
        {
            string LongStr1, LongStr2;
            int MaxLength, MinLenght, r=0;
            Console.WriteLine("Ведите число 1: ");
            LongStr1=Console.ReadLine();
            Console.WriteLine("Ведите число 2: ");
            LongStr2=Console.ReadLine();
            List<int> numbers1 = new List<int> {};
            List<int> numbers2 = new List<int> {};
            for (int i=0; i<LongStr1.Length; i++)
                {
                numbers1.Add(int.Parse(LongStr1[i].ToString()));
                }
            for (int i = 0; i < LongStr2.Length; i++)
                {
                numbers2.Add(int.Parse(LongStr2[i].ToString()));
                }
            if (numbers1.Count > numbers2.Count)
            {
                MaxLength = numbers1.Count;
                MinLenght = numbers2.Count;
            }
            else
            {
                MaxLength = numbers2.Count;
                MinLenght = numbers1.Count;
            }
            numbers1.Reverse();
            numbers2.Reverse();
            for (int i = 0; i < MaxLength; i++)
            {
                if (MinLenght <= i)
                { 
                    numbers1[i] += 0 + r;
                }
                else 
                {
                    numbers1[i] += numbers2[i] + r;
                }
                if (numbers1[i] >= 10)
                {
                    r = 1;
                    numbers1[i] -= 10;
                }
                else
                {
                    r = 0;
                }
            }
         if (r > 0)
            {
                numbers1.Add(r);
            }
            numbers1.Reverse();
            for (int i = 0; i < numbers1.Count; i++)
            {
                Console.Write(numbers1[i]);
            }
            Console.ReadKey();
        }
    }
}