Ограничения VBA в реализации арифметики длинных (больших) чисел

Узнай цену своей работы

Формулировка задачи:

Итак, моя юбилейная - первая тема на этом форуме. Здравствуйте Товарищи! Необходима помощь или совет от спецов этого форума. Работаю над арифметикой длинных (натуральных) чисел с размером значимой части числа до 32 тыс.знаков (мах. для ячейки Excel). Есть замечательный алгоритм на собственном типе переменной через массив и длинной арифметике (не мой) и мой собственный, только через String. По первому - есть ограничения до 10 тыс. символов в связи с особенностью VBA, по второму - в 30 раз медленнее. Думаю можно ли пойти другим путем (увеличь быстродействие) в VBA (без dll, сторонних языков), возможно через собственный класс, куда двигать дальше? Буду рад любому совету!

Решение задачи: «Ограничения VBA в реализации арифметики длинных (больших) чисел»

textual
Листинг программы
  1. Function ABC2ABC(num As String, osn1 As Long, osn2 As Long) As String
  2.     Dim a(100000) As Long, b As Long, c As Long, l As Long
  3.     Dim i As Long, j As Long, k As Long, txt As String
  4.  
  5.     For i = 1 To Len(num)
  6.         j = -1
  7.         While j < l Or c > 0
  8.             j = j + 1
  9.             b = a(j) * osn1 + c
  10.             a(j) = b Mod 10000
  11.             c = b \ 10000
  12.         Wend
  13.         l = j
  14.        
  15.         с = Asc(UCase(Mid(num, i, 1)))
  16.         If с <= 57 Then c = с - 48 Else c = с - 55
  17.        
  18.         j = -1
  19.         While c > 0
  20.             j = j + 1
  21.             b = a(j) + c
  22.             a(j) = b Mod 10000
  23.             c = b \ 10000
  24.         Wend
  25.         If j > l Then l = j
  26.     Next i
  27.    
  28.     Do
  29.         b = 0
  30.         For i = l To 0 Step -1
  31.             b = (b * 10000 + a(i)) Mod osn2
  32.         Next i
  33.         If b < 10 Then b = b + 48 Else b = b + 55
  34.         k = k + 1
  35.         If k > Len(txt) Then txt = txt & Space$(1000)
  36.         Mid$(txt, k, 1) = Chr$(b)
  37.        
  38.         c = 0
  39.         j = l
  40.         For i = l To 0 Step -1
  41.             b = c * 10000 + a(i)
  42.             a(i) = b \ osn2
  43.             c = b Mod osn2
  44.             If a(i) = 0 And i = l Then j = i - 1
  45.         Next i
  46.         l = j
  47.     Loop While l >= 0
  48.     ABC2ABC = StrReverse(Left$(txt, k))
  49. End Function

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


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

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

15   голосов , оценка 4.2 из 5

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

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

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