Реализация длинной арифметики: исправить код - 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");