Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Конкурс для программистов (https://forum.antichat.xyz/showthread.php?t=117120)

Stanislaw 22.04.2009 05:53

Конкурс для программистов
 
Кто максимально быстро назовет количество нулей на конце и пять последних чисел перед ними у факториала числа 13000.
P.S.: если кто не знает, факториал числа n = 1*2*3*...*n
То есть факториал 6 = 1*2*3*4*5*6=720.

Итак! Кто же решится реализовать ЭТО на php? ;)

Stanislaw 22.04.2009 06:16

Могу привести скрипт, который будет считать небольшие факториалы. как его усовершенствовать - в этом соль задачки :)
function get_fact($n)
{
$fact = 1;
for($i=1;$i<=$n;++$i)
{
$fact *= $i;
}
return $fact;
}
////////////////
Временно офф - пошел в школу
Тому, кто первый назовет цифры отстегну репки

NuR 22.04.2009 06:22

ты в школе изучал математику? примерно представляешь какой размерности придется хранить числа? и есть ли такие типы данных в природе.
upd
на 32 битном пхп во флоат можно уместить примерно 170! если прикидывать по формуле Стиринга sqrt(2*pi()*$n)*pow(($n/M_E),$n);
upd
хм.. пхп ацкая вещь, 6826351722496 потом 3248 нуля
вот так оно выглядит xD
http://www.sendspace.com/file/5zqhee

nerezus 22.04.2009 11:07

Цитата:

примерно представляешь какой размерности придется хранить числа? и есть ли такие типы данных в природе.
Ога, есть.
Тип long в питоне

Код:

import operator
reduce(operator.mul, range(1, 13000 + 1))


Gifts 22.04.2009 11:48

nerezus или просто
Код:

from math import factorial
a = factorial(13000)


Stanislaw 22.04.2009 13:24

NuR выиграл=)

nerezus 22.04.2009 18:28

Stanislaw, неа. Gifts выиграл.

Stanislaw 22.04.2009 20:26

Цитата:

Кто максимально быстро назовет количество нулей на конце и пять последних чисел перед ними у факториала числа 13000.
NuR сделал это первый

mailbrush 22.04.2009 20:44

Реально, школьник. Тебе что важно - кто сделал первый, или кто качественнее сделал?

astrologer 22.04.2009 21:20

Вообще-то, для этого не нужно считать факториал.
Количество нулей можно найти хоть на бумажке, т.к. ноль образуется из произведения 2 * 5, двойки всегда в избытке.
PHP код:

function countZeroes($n)
{
  
$base   5;
  
$power  1;
  
$amount 0;

  while(
$power $n)
  {
    
$amount += floor($n $power *= $base);
  }
  
  return 
$amount;
}

echo 
countZeroes(13000); // 3248 

Скорее всего это вообще решается без циклов, одним выражением.


Время: 06:31