Реализовать класс больших целых чисел - 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
Листинг программы
  1. using System;
  2.  
  3. public class BigNumber
  4. {
  5.     static const int m = 3;
  6.     uint[] a;
  7.     bool isNegative;  
  8.     private BigNumber(uint[] a, bool isNegative)
  9.     {
  10.         this.a = a;
  11.         this.isNegative = isNegative;
  12.     }
  13.     public BigNumber(string s)
  14.     {
  15.         isNegative = s[0] == '-'
  16.                      if(isNegative) s = s.Substring(1);
  17.         while(s.Length % m != 0) s = "0" + s;
  18.         a = new uint[s.Length / m];
  19.         for(uint i = 0; i < s.Length; i += m)
  20.         {
  21.             String n = s.Substring(i, m);
  22.             a[s.Length / m - i - 1] = Convert.ToUInt32(n);
  23.         }
  24.     }
  25.     public String ToString()
  26.     {
  27.         string res = "";
  28.         if (isNegative) res += "-";
  29.         foreach (uint x in a)
  30.         {
  31.             res += String.Format("{0:3d}", x)
  32.         }
  33.         return res;
  34.     }
  35.     public static BigNumber operator - (BigNumber bn)
  36.     {
  37.         return new BigNumber(a, !isNegative);
  38.     }
  39.     public static BigNumber operator + (BigNumber bn1, BigNumber bn2)
  40.     {
  41.         int length = bn1.a.Length > bn2.a.Length ? bn1.a.Length : bn2.a.Length;
  42.         int[] r = new int[length + 1];
  43.         int c = 1;
  44.         for(int i = 0; i < m; i++) c *= 10;
  45.         bool adding = bn1.isNegative == bn2.isNegative;
  46.         for (int i = 0; i < r.Length; i++)
  47.             r[i] = 0;
  48.         for (int i = 0; i < length; i++)
  49.         {
  50.             if(bn1.a.Length < i) r[i] += bn1.a[i];
  51.             if(bn2.a.Length < i)
  52.             {
  53.                 if(adding)
  54.                     if(r[i] + bn2.a[i] < c)
  55.                         r[i] += bn2.a[i];
  56.                     else
  57.                     {
  58.                         r[i] += bn2.a[i];
  59.                         r[i] -= c;
  60.                         r[i + 1]++;
  61.                     }
  62.                 else if (r[i] > bn2.a[i])
  63.                     r[i] -= bn2.a[i];
  64.                 else
  65.                 {
  66.                     r[i] += c;
  67.                     r[i] -= bn2.a[i];
  68.                     r[i + 1]--;
  69.                 }
  70.             }
  71.         }
  72.         bool neg = bn1.isNegative;
  73.         if(r[length] < 0)
  74.         {
  75.             foreach (int x in r)
  76.             {
  77.                 x = c - 1 - x;
  78.             }
  79.             r[length] = 0;
  80.             neg = !neg;
  81.         }
  82.         return new BigNumber(r, neg);
  83.     }
  84.     public static BigNumber operator - (BigNumber bn1, BigNumber bn2)
  85.     {
  86.         return bn1 + (-bn2);
  87.     }
  88. }
  89.  
  90. class Program
  91. {
  92.     static int Main(string[] args)
  93.     {
  94.         BigNumber bn1 = new BigNumber("-1234567890");
  95.         BigNumber bn2 = new BigNumber("987654321");
  96.         return 0;
  97.     }
  98. }

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


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

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

6   голосов , оценка 3.5 из 5

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

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

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