Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Факториал, чето совсем не понятное задание 
:(
    Опции темы
Alex101
Дата 9.11.2004, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: 1
Всего: 10



Цитата(Akina @ 9.11.2004, 07:25)
chaos
Это я к тому что для чисел менее 25 достаточно просчитывать последнюю ненулевую цифирь, для чисел 26-50 - уже 2, до 75 - три, до 100 - 4, до 125 - 5, до 150 - уже 7... в общем по n-1 дополнительной хвостовой цифири для каждого множителя, делящегося на 25 (где n - кол-во пятерок средим его простых множителей)...

По-моему, надо запоминать только 2 последние ненулевые цифры, остальные просто смысла нет помнить. Ведь в формировании последней цифры участвуют всего две...


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
maxim1000
Дата 9.11.2004, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
По-моему, надо запоминать только 2 последние ненулевые цифры, остальные просто смысла нет помнить. Ведь в формировании последней цифры участвуют всего две...

действительно так, но: а вдруг эта цифра станет нулевой?
тогда последней цифрой становится другая, в формировании которой принимали участие другие цифры


--------------------
qqq
PM WWW   Вверх
Alex101
Дата 9.11.2004, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: 1
Всего: 10



maxim1000
Да, ты прав.
И мое решение выдает ошибку при факториале 25... (Сегодня проверил)


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
GePo
Дата 12.11.2004, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 30.3.2003
Где: Москва

Репутация: нет
Всего: 3



chaos:
Цитата

Определить последнюю цифру не равную 0 при вычислении факториала N!, причем N задается в пределах от 1 до 10000

Эту задачу школьники решают!
Факториал числа с некоторого номера заканчивается нулями. Нули беруться только от перемножения двоек на пятерки. Кого больше? Ясно пятерок. Поэтому, подсчитаем кол-во пятерок, входящих в n!(n div 5 + n div 25 + ....).
Теперь начнем считать нашу последнюю цифру, выкидывая все пятерки и такое же кол-во двоек:
Код

var
 n, k, s, t, i, j : integer;
begin
 read(n);
 k := n div 5;
 s := 0;
 while k > 0 do
   begin
     s := s + k;
     k := k div 5
   end;
 t := 1;
 for i := 2 to n do
 begin
   j := i;
   while j mod 5 = 0 do
     j := j div 5;
   while (s > 0) and (j mod 2 = 0) do
     begin
       j := j div 2;
s := s-1
     end;
   t := t*(j mod 10) mod 10
 end;
 write(t);
end.

--------------------
PM MAIL WWW   Вверх
Akina
Дата 12.11.2004, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



GePo
Цитата
N задается в пределах от 1 до 10000

Догадываешься куда пошел твой алгоритм? туда же куда и наши - в математику длинных чисел. В том виде в каком он приведен...

Однако кое-что интересное тут есть - попробую дома накидать алгоритм, поздно уже...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Alex101
Дата 12.11.2004, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: 1
Всего: 10



GePo
Что-то у меня алгоритм не работает...


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
GePo
Дата 12.11.2004, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 30.3.2003
Где: Москва

Репутация: нет
Всего: 3



Akina
Цитата

Догадываешься куда пошел твой алгоритм? туда же куда и наши - в математику длинных чисел. В том виде в каком он приведен...

ЧЕГО????? smile там все вычисления по модулю десять идут! до хоть n до миллиона!

Alex101
на каких примерах не работает? вообще этот алгоритм точно правильный, не только я это придумывал, но и написано это где-то. Я его сейчас просто вспомнил
--------------------
PM MAIL WWW   Вверх
Alex101
Дата 12.11.2004, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: 1
Всего: 10



GePo
24
Зацикливается...


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
GePo
Дата 12.11.2004, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 30.3.2003
Где: Москва

Репутация: нет
Всего: 3



Alex101
Не понял... у меня все нормально... Где он вообще может зацклиться?

Это сообщение отредактировал(а) GePo - 12.11.2004, 19:18
--------------------
PM MAIL WWW   Вверх
Freeman
  Дата 12.11.2004, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 29.11.2003

Репутация: нет
Всего: нет



to GePo
Цитата
И мое решение выдает ошибку при факториале 25... (Сегодня проверил)


Можно спросить на чем ты проверял ?

Это сообщение отредактировал(а) Freeman - 12.11.2004, 22:40
PM MAIL   Вверх
GePo
Дата 13.11.2004, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 30.3.2003
Где: Москва

Репутация: нет
Всего: 3



Freeman
цитата не моя
--------------------
PM MAIL WWW   Вверх
Kefir
Дата 13.11.2004, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 1
Всего: 87



можете проверить ещё одно число
2004! -> 2
PM MAIL WWW Skype   Вверх
maxim1000
Дата 13.11.2004, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Kefir @ 12.11.2004, 23:39)
можете проверить ещё одно число
2004! -> 2

совпадает... а какой источник?
2005! -> 6 (это моя программа дает)


--------------------
qqq
PM WWW   Вверх
Kefir
Дата 13.11.2004, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 1
Всего: 87



maxim1000 источник - линуксовский калькулятор (не помню как называется...)
можешь ещё проверить:
100 000! -> 6
а сколько у тя прога считает для 2004?
PM MAIL WWW Skype   Вверх
maxim1000
Дата 13.11.2004, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
а сколько у тя прога считает для 2004?

незаметно
Цитата
можешь ещё проверить:
100 000! -> 6

я рассчитывал на числа до 10 000, для больших не работает, т.к. хранятся последние цифр (если отбросить нули), а значит, умножение на число порядка 10^5 даст число порядка 10^10, что в 32 разряда не помещается
так что та программка, которую я привел не подойдет
НО:
если там изменить
Код
x%=100000;

на
Код
x%=10000;

то все заработает
получается 6
считает практически так же незаметно...
кстати, заметил у себя один багик (или бажик smile):
надо еще добавить
Код
while(qqq%10==0)
 qqq/=10;

а то число, которое умножается на qqq может и не делиться в данный момент на 2 или 5, правда, это влияет только на результаты для конкретных чисел (я нашел на 50000), после нескольких шагов все выравнивается, все 10-ки сокращаются
в общем, обновленная версия:
Код
int func(unsigned int n)
{
 unsigned int x,c;
 x=1;
 for(c=1;c<=n;c++)
 {
   int qqq=c;
   if(c==50000)
     c=c;
   while((x%2==0)&&(qqq%5==0))
   {
     x/=2;
     qqq/=5;
   }
   while((x%5==0)&&(qqq%2==0))
   {
     x/=5;
     qqq/=2;
   }
   while(qqq%10==0)
     qqq/=10;
   x*=qqq;
   x%=10000;
   //cout<<"   "<<x<<"\n";
 }
 return x%10;
}



--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.