Вычисление факториалов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Вычисление факториалов

Сообщение SeT » 05.12.2005 (Пн) 15:11

Охота написать прогу, которая бы вычисляла факториалы. Не по одному а пример, типа (7!+5!)/12!
Как сделать обработчик, который понимал бы, сколькизначный факториал нужно вычислить? (7! может 12! МОЖЕТ 123!)
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.12.2005 (Пн) 15:12

пиши парсер выражений

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.12.2005 (Пн) 15:16

Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 05.12.2005 (Пн) 15:24

Konst_One
Вот именно что не знаю как парсер писать
vvs_adm
Это ты ссылку на что сделал?
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.12.2005 (Пн) 15:47

На "парсер, который ты не знаешь, как писать" ...
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 05.12.2005 (Пн) 17:37

Так, чтоли ?

Private Function Fac(Num As Long) As Single
Fac = 1
For i = 2 To Num
Fac = Fac * Num
Next i
End Function

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.12.2005 (Пн) 18:13

AndreyIl Вау!!! Так вот она, эта волшебная формула... А я-то весь инет уже облазил :)

P.S.: Ты бы хоть все посты почитал ;)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

AlexBlack
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 18.07.2005 (Пн) 19:14
Откуда: Киефф, Юкрейн...

Сообщение AlexBlack » 05.12.2005 (Пн) 20:14

AndreyIl
Догадайся почему твой код неправильно вычисляет факториалы. :wink:
Красный, но студийный.

http://www.rs-creative.com
Alex_Black@rs-creative.com

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.12.2005 (Пн) 21:09

Private Function Fac(Num As Long) As Single

Это ж с какого бодунища надо написать :) Не считая отсутствия объявлений и проверок ... :lol:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 06.12.2005 (Вт) 17:07

To vvs_adm: я приводил простой пример, который надо было самому доработать, поэтому нет проверок.
Что касается "бодунища" (As Single), то при большом Num вылетает ошибка: переполнение памяти.

AlexBlack
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 18.07.2005 (Пн) 19:14
Откуда: Киефф, Юкрейн...

Сообщение AlexBlack » 06.12.2005 (Вт) 17:16

Помоему всё таки факториал 3 не 9.
А 4 не 16.

И вааще нужно делать это рукурсивно.

Код: Выделить всё
Sub Fac(Num as integr) as integer
if num=1 then fac=1 else fac=fac(num-1)*num
end Sub


Вот так это работает.
Красный, но студийный.

http://www.rs-creative.com
Alex_Black@rs-creative.com

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

Сообщение alibek » 06.12.2005 (Вт) 18:07

Лучше делать это гибридно.
Т.е. рекурсивно, пока стек позволяет, а когда глубина рекурсии достигнет определенной глубины, либо освобождать стек, либо переходить на цикл.
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 18:21

У меня стек позволяет до 6460, так что надо циклом...
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 06.12.2005 (Вт) 23:01

Кста, вопрос почти в тему: кто-нибудь пытался написать алгоритм для выполнения операций над сверхдлинными числами без потери разрядов?
К примеру, умножить два целых (хотя бы) числа, каждое из которых длиной по паре сотен тысяч разрядов..
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.12.2005 (Вт) 23:34

Cryonyx, а чего тут сложного? :-?


На каждой школьной олимпиаде, где я участвовал, было по задачке на длинную арифметику. Так что лично я - писал, и не раз :-)
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 07.12.2005 (Ср) 0:23

AlexBlack писал(а):Помоему всё таки факториал 3 не 9.
А 4 не 16.

И вааще нужно делать это рукурсивно.

Код: Выделить всё
Sub Fac(Num as integr) as integer
if num=1 then fac=1 else fac=fac(num-1)*num
end Sub


Вот так это работает.

Объясните мне пжлста почему функция Fac не возвращается пока условие не выполнится правильно :roll:
Если всё делать своими ручками, они скоро отвалятся !

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 07.12.2005 (Ср) 0:36

2 tyomitch
Да ясен пень, что ничего сложного :)
Просто мне интересны все подходы, которые можно применить в рамках ВБ. В нём ведь довольно трудно напрямую работать с памятью, да и я всё-таки ещё начинающий ламер с двухлетним стажем в нём :D
Если есть какие наработки в исходниках, можешь кинуть?
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 07.12.2005 (Ср) 0:38

2 Kovu
Потому что там ошибка - нельзя использовать имя функции как переменную, только для присвоения значения. Да и с типами данных намудрили..
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2005 (Ср) 1:13

Cryonyx писал(а):нельзя использовать имя функции как переменную, только для присвоения значения.

Можно. Проверь и убедись.

Зачем для длинной арифметики "прямая работа с памятью" - я не понял.
Изображение

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 07.12.2005 (Ср) 8:35

Kovu писал(а):Объясните мне пжлста почему функция Fac не возвращается пока условие не выполнится правильно :roll:

Если условие выполненно, то функция возвращает значение, а иначе просто ей требуется вызвать себя для вычисления конечного значения.
Когда вычисляется значение последней функции, завершается предпоследняя, потом та что до нее, и.т.д. Все они завершаются со временем. :wink:

AndreyIl
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 18.10.2005 (Вт) 16:17
Откуда: г. Брянск

Сообщение AndreyIl » 07.12.2005 (Ср) 9:26

Виноват. Вот так работает.

Private Function Fac(Num As Long) As Single
Fac = 1
For i = 2 To Num
Fac = Fac * i
Next i
End Function

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 07.12.2005 (Ср) 10:36

2 tyomich
1. Сорри, ступил :)
2. Сам делаешь аллок памяти необходимого размера, затем используешь её как стек. Не прокатит, по-твоему? Какие ещё есть варианты?
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2005 (Ср) 13:26

Cryonyx, зачем это для умножения чисел стек? :shock:
Изображение

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

Сообщение alibek » 07.12.2005 (Ср) 13:33

tyomitch писал(а):Cryonyx, зачем это для умножения чисел стек? :shock:

Ну как же :)
Суммировать их рекурсией :)
Lasciate ogni speranza, voi ch'entrate.

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 07.12.2005 (Ср) 17:13

2 tyomich
Ладно, может я как всегда не так выразился.
Я хочу научить прогу оперировать числами, длина которых превышает допустимый размер переменной в ВБ. Я конечно понимаю, что есть тип Double или Currency, на худой конец, но они ведь тоже точны до определённого предела. Поэтому и нужно какой-нибудь метод, позволяющий, скажем, сбрасывать допустимую часть данных в стек, и продолжать операции с оставшейся частью. Вот.

Надеюсь, теперь я понят :?: :wink:
Тёмыч, ну уж тебе-то после ответов на такое количество глупых вопросов, задаваемых на этом форуме, должно же стать понятно.. :D :D
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

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

Cryonyx писал(а):Поэтому и нужно какой-нибудь метод, позволяющий, скажем, сбрасывать допустимую часть данных в стек, и продолжать операции с оставшейся частью.

А вот это полная чушь.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2005 (Ср) 19:15

Начинающий ламер с двухлетним стажем Cryonyx не слышал про массивы? :shock: :shock:
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 07.12.2005 (Ср) 23:14

Да не то я имел в виду...
Ведь и у массивов наверняка есть предел?
А как его обойти?

Вот сколько максимально может быть элементов массива?
2^n? Размер каждого элемента под два метра, так что, казалось бы, этого достаточно... А если нет?
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 07.12.2005 (Ср) 23:35

Ох... Неужели делать массив массивов? Или двумерный? Трехмерный? N-мерный? :wink:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.12.2005 (Ср) 23:37

2Cryonyx: уверяю тебя, что "два целых числа, каждое из которых длиной по паре сотен тысяч разрядов" (т.е. каждое меньше 100Кб) -- в массив поместятся ;-)
Изображение

След.

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

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

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

    TopList