Реализация длинной арифметики: исправить код - 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");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д