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