Функция Mod

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Medved
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 10.11.2004 (Ср) 10:30

Функция Mod

Сообщение Medved » 10.11.2004 (Ср) 10:43

Здраствуйте
Скажыте пожалуста как мне взять Mod от очень большого числа.
Когда я ето делаю выкидевает ошибку Overflow
Спасибо!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.11.2004 (Ср) 11:31

a = b mod c :arrow: a = b - b \ c
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Medved
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 10.11.2004 (Ср) 10:30

Сообщение Medved » 10.11.2004 (Ср) 11:46

Когда ми ето зделаем ми получим десятичное число, а нужно целое.
Пример

47^19 mod 77
Mod ето зделать не может, он делает для чисел приблизительно до 10^7

При простом деление ми можем потерять последние цыфры и в итоге не ту остачу.

Еще раз спасибо!
Очень нужно!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.11.2004 (Ср) 11:52

Во-первых, я ошибся...
a = b - c * (b \ c)

Хотя ошибка всё равно возникает.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Medved
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 10.11.2004 (Ср) 10:30

Сообщение Medved » 10.11.2004 (Ср) 12:14

Математичиски выходит 0
Програмно может выйти десятичное или я не прав?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.11.2004 (Ср) 13:10

Да с какого ж перепугу будет 0?

? 56 mod 6
2
? 56 - 6*(56\6)
2

Ты отличие целочисленного деления от обычного знаешь?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 10.11.2004 (Ср) 13:33

AFAIK mod и \ работают только с целыми типами данных (больше чем long они не понимают)
a = b - c * CInt(b / c)
может так сработает?
Ничто так не ограничивает полёт мысли программиста, как компилятор

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 10.11.2004 (Ср) 17:03

2 corgi: Ваша подпись оказалась как нельзя кстати к вашему посту. :)

Как показывает практика, функции типа Hex, Mod, Xor и некоторые другие действительно ставят раком мозги и выдают переполнение, если подсунуть им, скажем, тот же Currency. Мне в свое время пришлось через LSet разбивать лонг на RGBA только потому, что And как-то не так себя повел. Что делать... можно попытаться написать свои функции, но они будут заведомо медленнее. Можно извратнуться с внешей DLL, написанной на том же С++. Кстати, не уверен, что С++ будет без проблем работать с типами произвольной длины. Если только 64-битное целое подсунуть.

Не удивлюсь, кстати, если оператор целочисленного деления ведет себя так же :) ...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.11.2004 (Ср) 17:40

Он себя так и ведет и об этом сказано в писании :) Правда не помню, где конкретно, но что-то такое я читал.
Самый правильный путь - реализовать свою арифметику (используя в качестве аргументов байтовые массивы или стринги). Но слишком много хлопот с этим.
Lasciate ogni speranza, voi ch'entrate.

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 10.11.2004 (Ср) 18:13

где брал не помню, но у меня есть такая вещь:
Оператор \
Возвращает результат целочисленного деления двух чисел.

Перед выполнением деления значения операндов округляются до целых значений типа Byte, Integer или Long.
Обычно, результат имеет тип данных Byte, подтип Byte типа Variant, тип Integer, подтип Integer типа Variant, тип Long или подтип Long типа Variant, вне зависимости от того, является ли результат целым числом. Любая дробная часть отбрасывается. Если один или оба операнда является выражением со значением Null, результат имеет значение Null. Выражение, имеющее значение Empty, рассматривается как имеющее значение 0.

Оператор Mod
Возвращает остаток при целом делении двух чисел (значение по модулю).

Обычно, результат имеет тип данных Byte, подтип Byte типа Variant, тип Integer, подтип Integer типа Variant, тип Long или подтип Long типа Variant, вне зависимости от того, является ли результат целым числом. Любая дробная часть отбрасывается. Если один или оба операнда является выражением со значением Null, результат имеет значение Null. Выражение, имеющее значение Empty, рассматривается как имеющее значение 0.
Ничто так не ограничивает полёт мысли программиста, как компилятор

Medved
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 10.11.2004 (Ср) 10:30

Сообщение Medved » 11.11.2004 (Чт) 2:03

Спасибо всем но я решил другим путьом
С CInt издает ту же самкю ошибку
У меня число подносилось к степини пр. 65^38
Я его разклал на два 65^19*65^19 и т.д.
А потом использовал формулу (a*b) mod n = (a mod n * b mod n) mod n

:lol:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList