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