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

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

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

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

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

textual
Листинг программы
Function ABC2ABC(num As String, osn1 As Long, osn2 As Long) As String
    Dim a(100000) As Long, b As Long, c As Long, l As Long
    Dim i As Long, j As Long, k As Long, txt As String
 
    For i = 1 To Len(num)
        j = -1
        While j < l Or c > 0
            j = j + 1
            b = a(j) * osn1 + c
            a(j) = b Mod 10000
            c = b \ 10000
        Wend
        l = j
        
        с = Asc(UCase(Mid(num, i, 1)))
        If с <= 57 Then c = с - 48 Else c = с - 55
        
        j = -1
        While c > 0
            j = j + 1
            b = a(j) + c
            a(j) = b Mod 10000
            c = b \ 10000
        Wend
        If j > l Then l = j
    Next i
    
    Do
        b = 0
        For i = l To 0 Step -1
            b = (b * 10000 + a(i)) Mod osn2
        Next i
        If b < 10 Then b = b + 48 Else b = b + 55
        k = k + 1
        If k > Len(txt) Then txt = txt & Space$(1000)
        Mid$(txt, k, 1) = Chr$(b)
        
        c = 0
        j = l
        For i = l To 0 Step -1
            b = c * 10000 + a(i)
            a(i) = b \ osn2
            c = b Mod osn2
            If a(i) = 0 And i = l Then j = i - 1
        Next i
        l = j
    Loop While l >= 0
    ABC2ABC = StrReverse(Left$(txt, k))
End Function

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


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

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

15   голосов , оценка 4.2 из 5
Похожие ответы