Страница: 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
Себя процитирую
To: Sharp
Что это? Где качнуть? И размер какой? 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
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-сайт:
Профиль | | #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
Пасиба. Жаль что нужда в таком модуле отпала. Но кому-то такое наверняка пригодится.