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

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

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

разработать класс или библиотеку функций для работы с m-битными целыми числами. Библиотека должна поддерживать числа длины до 2048 бит. 1) перевод малых констант в формат большого числа (в частности, 0 и 1); 2) сложения чисел; 3) вычитание чисел; 4) умножения чисел, возведение в квадрарт 5) деление чисел, нахождение остатка от деления; 6) возведения числа в многоразрядную степень; 7) преобразования числа в символьную срока и обратное преобразование символьной строки в число; обязательная поддержка шестнадцатеричного представления, желательно - десятичного и двоичного. Может кто-то подсказать(подправить) как решить проблему с вводом большого числа. например функция input нормально работает для длины 4, для большего уже вылазит ошибка, аналогично для inputbin.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace ConsoleApplication48
  8. {
  9. class Program
  10. {
  11. static String number1 = "AAABABABABABABABBABA";
  12. static String number2 = "ABABABABABABABABABBB";
  13.  
  14. public static long[] input(String number)
  15. {
  16. int masnumber;
  17. int rest = (number.Length) % 4;
  18. if (rest != 0)
  19. masnumber = ((number.Length - rest) / 4) + 1;
  20. else masnumber = number.Length / 4;
  21.  
  22. String[] mas_str;
  23. mas_str = new String[masnumber+1];
  24. if (rest != 0)
  25. {
  26. for (int i = 0; i < (masnumber - 1); i++)
  27. mas_str[i] = number1.Substring(number.Length - 4 * (i + 1), number.Length - 4 * (i + 1) + 4);
  28. mas_str[masnumber - 1] = number.Substring(0, rest);
  29. }
  30. else
  31. for (int i = 0; i < (masnumber); i++)
  32. mas_str[i] = number.Substring(number.Length - 4 * (i + 1), number.Length - 4 * (i + 1) +4);
  33. long[] mas_int;
  34. mas_int = new long[masnumber];
  35. for (int i = 0; i < masnumber; i++)
  36. mas_int[i] = Convert.ToInt32(mas_str[i], 16);
  37. return mas_int;
  38. }
  39. public static long[] InputBin(String number)
  40. {
  41. int masnumber;
  42. int rest = (number.Length) % 16;
  43. if (rest != 0)
  44. masnumber = ((number.Length - rest) / 16) + 1;
  45. else masnumber = number.Length / 16;
  46.  
  47. String[] mas_str;
  48. mas_str = new String[masnumber + 1];
  49. if (rest != 0)
  50. {
  51. for (int i = 0; i < (masnumber - 1); i++)
  52. mas_str[i] = number.Substring(number.Length - 16 * (i + 1), number.Length - 16 * (i + 1) + 16);
  53. mas_str[masnumber - 1] = number.Substring(0, rest);
  54. }
  55. else
  56. for (int i = 0; i < (masnumber); i++)
  57. mas_str[i] = number.Substring(number.Length - 16 * (i + 1), number.Length - 16 * (i + 1) + 16);
  58. long[] mas_int;
  59. mas_int = new long[masnumber];
  60. for (int i = 0; i < masnumber; i++)
  61. mas_int[i] = Convert.ToInt32(mas_str[i],2);
  62. return mas_int;
  63. }
  64. public static void output(long[] mas) {
  65. Console.WriteLine("\narray:");
  66. for (int i = 0; i < mas.Length; i++) {
  67. Console.WriteLine("mas[" + i + "] = " + mas[i] + "\n");
  68. }
  69. }
  70. public static long[] add(long[] mas1, long[] mas2)
  71. {
  72. long[] mas3;
  73. long[] mas_c;
  74. int maxLength;
  75. if (mas1.Length >= mas2.Length)
  76. maxLength = mas1.Length;
  77. else maxLength = mas2.Length;
  78. int m1 = mas1.Length;
  79. int m2 = mas2.Length;
  80. long[] mas_max;
  81. mas_max = new long[maxLength];
  82. if (m1 > m2)
  83. {
  84. for (int i = 0; i < m2; i++)
  85. mas_max[i] = mas2[i];
  86. for (int i = m2; i < m1; i++)
  87. mas_max[i] = 0;
  88. }
  89. if (m2 > m1)
  90. {
  91. for (int i = 0; i < m1; i++)
  92. mas_max[i] = mas1[i];
  93. for (int i = m1; i < m2; i++)
  94. mas_max[i] = 0;
  95. }
  96. if (m1 == m2)
  97. {
  98. for (int i = 0; i < m1; i++)
  99. mas_max[i] = mas2[i];
  100. }
  101. mas3 = new long[maxLength + 1];
  102. mas_c = new long[maxLength + 1];
  103. mas_c[0] = 0;
  104. if (m1 >= m2)
  105. {
  106. for (int i = 0; i < maxLength; i++)
  107. {
  108. mas_c[i + 1] = Math.Abs((mas1[i] + mas_max[i] + mas_c[i]) / b);
  109. }
  110. if (mas_c[maxLength] != 0)
  111. {
  112. mas3[maxLength] = mas_c[maxLength];
  113. }
  114. for (int i = 0; i < maxLength; i++)
  115. {
  116. mas3[i] = (mas1[i] + mas_max[i] + mas_c[i]) % b;
  117. }
  118. }
  119. else
  120. {
  121. for (int i = 0; i < maxLength; i++)
  122. {
  123. mas_c[i + 1] = Math.Abs((mas2[i] + mas_max[i] + mas_c[i]) / b);
  124. }
  125. if (mas_c[maxLength] != 0)
  126. {
  127. mas3[maxLength] = mas_c[maxLength];
  128. }
  129. for (int i = 0; i < maxLength; i++)
  130. {
  131. mas3[i] = (mas2[i] + mas_max[i] + mas_c[i]) % b;
  132. }
  133. }
  134. return mas3;
  135. }
  136. static void Main(String[] args) {
  137. long[] a2, b2, c;
  138. a2 = input(number1);
  139. b2 = input(number2);
  140. Console.WriteLine(a2);
  141. Console.WriteLine(b2);
  142. c = add(a2,b2);
  143. output(c);
  144. Console.WriteLine("Input Enter,please........");
  145. while (Console.ReadKey().Key != ConsoleKey.Enter) ;
  146. }
  147. }
  148. }

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут