Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Динная арифметика Добавлено: 21.07.07 20:55  

Автор вопроса:  ZagZag | ICQ: 295002202 

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 16
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #16 Добавлено: 23.07.07 10:05
В .NET Framework 3.5 появился класс BigInteger

Ответить

Номер ответа: 17
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #17 Добавлено: 23.07.07 14:05
To: Black Brand
Себя процитирую
lang: VB6.0


To: Sharp
Посмотри GMP

Что это? Где качнуть? И размер какой? lang: VB6.0?
Если есть ссылка - кинь, плз. Желательно сразу для скачки... и чтоб только исходник.
У меня режим жесткой экономии траффика. Я может повторюсь, но трафф у меня 7руб за метр =(
Был бы инет - я бы вообще топик не создавал.

Ща больше всего интересует как в длинной арифметике возвести одно число в степень другого числа. (при условии что оба чила - больше 3 разрядов, как минимум)

Для непонятливых ввожу локальный термин "Длинная арифметика". В моих постах он означает арифметику, в которой нет плавающих точек и разрядность цифр достигает нескольких сотен.
Может на .NET и есть такой класс или тип переменных, но я пишу только на VB6.0, а значит стандартной реализации нет и приходится все реализовывать руками.
Лучше бы конечно обрабатывать длинные числа как массивы, тогда разрядность будет ограничена только объемом виртуальной памяти. Я решил пока работать через строки - проще, но максимальная разрядность ограничена (65536)

Если есть реализации подобных классов на других языках, которые не поддерживают длинную арифметику стандартными средствами - прощу, кидайте сюда. Я уж с ними разберусь.. надеюсь =)

Вот -АлександР- вчера подкинул функцию вычитания длинных чисел, я ее поверхностно посмотрел - вроде то что надо, пасибо ему.

Ща сам работаю надо функцией сложения. Приходится вспоминать начальные школьные классы и сложение столбиком =)

Ответить

Номер ответа: 18
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #18 Добавлено: 23.07.07 14:09
2 Zag Zag

Можешь использовать через COM INTERROP

Ответить

Номер ответа: 19
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #19 Добавлено: 23.07.07 14:42
Black Brand, не ломай мой ник. Сокращенно: ZZ
COM INTERROP

1. Не знаю как
2. Быстордействие хоть и не требуется особого, но всеже. Я думаю использование COM от .NET (я так понял) не положительно на быстродействии скажется.
3. Если я всетаки правильно понял, то это - .NET технология? Тогда мне прийдется с моей прогой еще фреймворк таскать? ИМХО, вот это уже изврат - прога на VB6.0, а требует фреймворка =)

Ответить

Номер ответа: 20
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #20 Добавлено: 23.07.07 14:46
1. Сочуствую
2. Сочуствую.
3. Прога на VB 6.0 это уже зочетный изврат

Ответить

Номер ответа: 21
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #21 Добавлено: 23.07.07 18:29
да ну вас всех на***! флейм развели, а ответить не можете =)

зы бедный загги, буду иму в асю писать =) а то весь трафф просрете, там жо жпрс за 8 RpM

Ответить

Номер ответа: 22
Автор ответа:
 W[4Fh]LF



Вопросов: 0
Ответов: 187
 Web-сайт: hunger.ru
 Профиль | | #22
Добавлено: 27.07.07 19:25
Когда давно писал, пригодилось :)


'http://hunger.ru
'На собственном опыте убедился, что ВБ быстрее всего работает с массивами
'Поэтому здесь всё реализовано через них

Const ADDING = 0
Const SUBSTRACTION = 1

Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim ArrDigits()
Dim ArrVar1() As String
Dim ArrVar2() As String
Dim Num As Byte

Private Sub Command1_Click()
Text3.Text = Operation(Text1.Text, Text2.Text, ADDING)
End Sub

Private Sub Command2_Click()
Text3.Text = Operation(Text1.Text, Text2.Text, SUBSTRACTION)
End Sub

Function Operation(var1 As String, var2 As String, opConst As Byte) As String
a = GetTickCount()

If Len(var1) >= Len(var2) Then          'Если разрядность первого числа
    ReDim ArrDigits(Len(var1))          'больше, чем второго, то мы дополняем второе
    var2 = PadToString(var2, Len(var1)) 'число вначале нулями.
Else                                    'Наоборот? Значит дополняем первое.
    ReDim ArrDigits(Len(var2))
    var1 = PadToString(var1, Len(var2))
End If

ReDim ArrVar1(Len(var1) - 1)            'Объявялем границы массива в котором будут хранится
ReDim ArrVar2(Len(var1) - 1)            'наши большие числа.

For i = 1 To Len(var1)                  'Заполняем их. Каждый элемент массива - одна цифра
    ArrVar1(i - 1) = Mid(var1, i, 1)
    ArrVar2(i - 1) = Mid(var2, i, 1)
Next i

If opConst = ADDING Then Call AddFunc Else Call SubFunc

Operation = Replace(Join(ArrDigits, "";), " ", "";)
Operation = Operation & vbCrLf & "Время затраченное на операцию:" & Str(GetTickCount() - a)
End Function

Function AddFunc()                                  'Процедура сложения в столбик:)
For i = UBound(ArrVar2) To 0 Step -1
    Num = Val(ArrVar1(i)) + Val(ArrVar2(i))         'Складываем в цикле каждую цифру первого
                                                    'числа с каждой цифрой второго.
    If Num >= 10 And i > 0 Then                     'Если результат сложения больше 10 значит
        ArrVar1(i - 1) = Val(ArrVar1(i - 1)) + 1    'один в уме:)
        ArrDigits(i) = Str(Num - 10)                'Младший разряд числа и есть новая цифра
                                                    'в ответе
    Else                                            'Наоборот?
        ArrDigits(i) = Str(Num)                     'Так и оставляем
    End If
Next i
End Function

Function SubFunc() As String                            'Процедура сложения в столбик:)
For i = UBound(ArrVar2) To 0 Step -1
    If Val(ArrVar1(i)) < Val(ArrVar2(i)) Then           'Если цифра в первом числа меньше цифры во втором
        ArrVar1(i - 1) = Val(ArrVar1(i - 1)) - 1        'значит занимаем один у старшего разряда
        Num = Val(ArrVar1(i) + 10) - Val(ArrVar2(i))    'и производим вычитание
    Else                                                'Наоборот?
        Num = Val(ArrVar1(i)) - Val(ArrVar2(i))         'Так и оставляем.
    End If
    ArrDigits(i) = Str(Num)                             'Новая цифра в ответе:)
Next i
End Function

Public Function PadToString(myValue, Digits) As String
PadToString = String(Digits - Len(myValue), "0";) & myValue
End Function

Private Sub Text1_Change()
If Len(Text1.Text) > 0 Then Label1(0).Caption = "Разрядность: " & Len(Text1.Text)
End Sub

Private Sub Text2_Change()
If Len(Text2.Text) > 0 Then Label1(1).Caption = "Разрядность: " & Len(Text2.Text)
End Sub

Ответить

Номер ответа: 23
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #23
Добавлено: 28.07.07 12:38
тридцатидвухтысячсемьсотшестедятсемиричная система рулит!!! :)

Ответить

Номер ответа: 24
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #24 Добавлено: 28.07.07 15:26
Пасиба. Жаль что нужда в таком модуле отпала. Но кому-то такое наверняка пригодится.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам