Реализация длинной арифметики: исправить код - C#

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

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

разработать класс или библиотеку функций для работы с m-битными целыми числами. Библиотека должна поддерживать числа длины до 2048 бит. 1) перевод малых констант в формат большого числа (в частности, 0 и 1); 2) сложения чисел; 3) вычитание чисел; 4) умножения чисел, возведение в квадрарт 5) деление чисел, нахождение остатка от деления; 6) возведения числа в многоразрядную степень; 7) преобразования числа в символьную срока и обратное преобразование символьной строки в число; обязательная поддержка шестнадцатеричного представления, желательно - десятичного и двоичного. Может кто-то подсказать(подправить) как решить проблему с вводом большого числа. например функция input нормально работает для длины 4, для большего уже вылазит ошибка, аналогично для inputbin.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication48
{
    class Program
    {
 
        static String number1 = "AAABABABABABABABBABA";
        static String number2 = "ABABABABABABABABABBB";

        public static long[] input(String number)
        {
            int masnumber;                                                                       
            int rest = (number.Length) % 4;
            if (rest != 0)
                masnumber = ((number.Length - rest) / 4) + 1;
            else masnumber = number.Length / 4;

            String[] mas_str;
            mas_str = new String[masnumber+1];
            if (rest != 0)
            {
                for (int i = 0; i < (masnumber - 1); i++)
                    mas_str[i] = number1.Substring(number.Length - 4 * (i + 1), number.Length - 4 * (i + 1) + 4);
                mas_str[masnumber - 1] = number.Substring(0, rest);
            }
            else
                for (int i = 0; i < (masnumber); i++)
                    mas_str[i] = number.Substring(number.Length - 4 * (i + 1), number.Length - 4 * (i + 1) +4);
 
            long[] mas_int;
            mas_int = new long[masnumber];
            for (int i = 0; i < masnumber; i++)
               mas_int[i] = Convert.ToInt32(mas_str[i], 16);
                
            return mas_int;
        }
       
        public static long[] InputBin(String number)
        {
            int masnumber;                                                                        
            int rest = (number.Length) % 16;
            if (rest != 0)
                masnumber = ((number.Length - rest) / 16) + 1;
            else masnumber = number.Length / 16;

            String[] mas_str;
            mas_str = new String[masnumber + 1];
            if (rest != 0)
            {
                for (int i = 0; i < (masnumber - 1); i++)
                    mas_str[i] = number.Substring(number.Length - 16 * (i + 1), number.Length - 16 * (i + 1) + 16);
                mas_str[masnumber - 1] = number.Substring(0, rest);
            }
            else
                for (int i = 0; i < (masnumber); i++)
                    mas_str[i] = number.Substring(number.Length - 16 * (i + 1), number.Length - 16 * (i + 1) + 16);
 
            long[] mas_int;
            mas_int = new long[masnumber];
            for (int i = 0; i < masnumber; i++)
                mas_int[i] = Convert.ToInt32(mas_str[i],2);
            return mas_int;
        }
 
        public static void output(long[] mas) {
            
            Console.WriteLine("\narray:");
        for (int i = 0; i < mas.Length; i++) {
            Console.WriteLine("mas[" + i + "] = " + mas[i] + "\n");
        }
    }
 
  public static long[] add(long[] mas1, long[] mas2)
        {
            long[] mas3;
            long[] mas_c;
            int maxLength;
 
            if (mas1.Length >= mas2.Length)
                maxLength = mas1.Length;
            else maxLength = mas2.Length;
 
            int m1 = mas1.Length;
            int m2 = mas2.Length;
 
            long[] mas_max;
            mas_max = new long[maxLength];
            if (m1 > m2)
            {
                for (int i = 0; i < m2; i++)
                    mas_max[i] = mas2[i];
                for (int i = m2; i < m1; i++)
                    mas_max[i] = 0;
            }
            if (m2 > m1)
            {
                for (int i = 0; i < m1; i++)
                    mas_max[i] = mas1[i];
                for (int i = m1; i < m2; i++)
                    mas_max[i] = 0;
            }
            if (m1 == m2)
            {
                for (int i = 0; i < m1; i++)
                    mas_max[i] = mas2[i];
            }
            mas3 = new long[maxLength + 1];
            mas_c = new long[maxLength + 1];
            mas_c[0] = 0;
 
            if (m1 >= m2)
            {
                for (int i = 0; i < maxLength; i++)
                {
                    mas_c[i + 1] = Math.Abs((mas1[i] + mas_max[i] + mas_c[i]) / b);
                }
 
                if (mas_c[maxLength] != 0)
                {
                    mas3[maxLength] = mas_c[maxLength];
                }
 
                for (int i = 0; i < maxLength; i++)
                {
                    mas3[i] = (mas1[i] + mas_max[i] + mas_c[i]) % b;
                }
            }
            else
            {
                for (int i = 0; i < maxLength; i++)
                {
                    mas_c[i + 1] = Math.Abs((mas2[i] + mas_max[i] + mas_c[i]) / b);
                }
 
                if (mas_c[maxLength] != 0)
                {
                    mas3[maxLength] = mas_c[maxLength];
                }
 
                for (int i = 0; i < maxLength; i++)
                {
                    mas3[i] = (mas2[i] + mas_max[i] + mas_c[i]) % b;
                }
            }
            return mas3;
        }
 
  static void Main(String[] args) {
        long[] a2, b2, c;
    
            a2 = input(number1);
            b2 = input(number2);
            Console.WriteLine(a2);
            Console.WriteLine(b2);
            c = add(a2,b2);
            output(c);
        Console.WriteLine("Input Enter,please........");
        while (Console.ReadKey().Key != ConsoleKey.Enter) ;
    }
    }
}

Решение задачи: «Реализация длинной арифметики: исправить код»

textual
Листинг программы
            var b1 = BigInt.ParseHex("f12ba");
            var b2 = BigInt.ParseBin("01110");

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


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

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

11   голосов , оценка 4.091 из 5