Реализовать класс больших целых чисел - C#
Формулировка задачи:
Необходимо реализовать класс больших целых чисел.
Так как в типах int и long нет возможности хранить очень большие числовые значения,
состоящие из нескольких десятков знаков и более, нужно реализовать собственный класс
для работы с большими числами.
Большое число можно представить в виде суммы:
X=∑ (от i=0 до n-1)( 10^i*m)*(a i-тый), где m - заранее определенное натуральное число,
a i-тый-целое число, состоящее из не более m цифр.
Пример:
m=3, X=1234567890
X=890*10^0+567*10^3+234*10^6+1*10^9
Таким образом, большое число X можно представить в виде целочисленного массива A=[a i-ого]
Необходимо реализовать класс BigNumber, содержащий следующие члены:
1. Статистическая константа m (ее значения на ваше усмотрение).
2. Массив A чисел, которые определяют большое число(большое число по своему написанию является последовательностью чисел из массива A).
3. Знак числа (+/-, тип bool).
4. Конструктор для инициализации экземпляра класса из строкового написания большого числа (из переменной типа string).
5.Перезагрузка операторов: - (унарный), -(бинарный), +,*,/,==,!=,>,<,<=, >+, также для бинарных
варианты перезагрузки с одним из операндов типа int.
6. Перезагрузка метода ToString() для перевода числа в строковое написание.
Решение задачи: «Реализовать класс больших целых чисел»
textual
Листинг программы
using System;
public class BigNumber
{
static const int m = 3;
uint[] a;
bool isNegative;
private BigNumber(uint[] a, bool isNegative)
{
this.a = a;
this.isNegative = isNegative;
}
public BigNumber(string s)
{
isNegative = s[0] == '-'
if(isNegative) s = s.Substring(1);
while(s.Length % m != 0) s = "0" + s;
a = new uint[s.Length / m];
for(uint i = 0; i < s.Length; i += m)
{
String n = s.Substring(i, m);
a[s.Length / m - i - 1] = Convert.ToUInt32(n);
}
}
public String ToString()
{
string res = "";
if (isNegative) res += "-";
foreach (uint x in a)
{
res += String.Format("{0:3d}", x)
}
return res;
}
public static BigNumber operator - (BigNumber bn)
{
return new BigNumber(a, !isNegative);
}
public static BigNumber operator + (BigNumber bn1, BigNumber bn2)
{
int length = bn1.a.Length > bn2.a.Length ? bn1.a.Length : bn2.a.Length;
int[] r = new int[length + 1];
int c = 1;
for(int i = 0; i < m; i++) c *= 10;
bool adding = bn1.isNegative == bn2.isNegative;
for (int i = 0; i < r.Length; i++)
r[i] = 0;
for (int i = 0; i < length; i++)
{
if(bn1.a.Length < i) r[i] += bn1.a[i];
if(bn2.a.Length < i)
{
if(adding)
if(r[i] + bn2.a[i] < c)
r[i] += bn2.a[i];
else
{
r[i] += bn2.a[i];
r[i] -= c;
r[i + 1]++;
}
else if (r[i] > bn2.a[i])
r[i] -= bn2.a[i];
else
{
r[i] += c;
r[i] -= bn2.a[i];
r[i + 1]--;
}
}
}
bool neg = bn1.isNegative;
if(r[length] < 0)
{
foreach (int x in r)
{
x = c - 1 - x;
}
r[length] = 0;
neg = !neg;
}
return new BigNumber(r, neg);
}
public static BigNumber operator - (BigNumber bn1, BigNumber bn2)
{
return bn1 + (-bn2);
}
}
class Program
{
static int Main(string[] args)
{
BigNumber bn1 = new BigNumber("-1234567890");
BigNumber bn2 = new BigNumber("987654321");
return 0;
}
}