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