Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Колличество нулей в конце факториала (https://javascript.ru/forum/misc/70740-kollichestvo-nulejj-v-konce-faktoriala.html)

tghoster 29.09.2017 01:43

Колличество нулей в конце факториала
 
Есть массив чисел, нужно найти кол-во нулей в конце факториала каждого из чисел. Сама уже не могу справиться

j0hnik 29.09.2017 02:39

alert([1,2,3,4,5,6,7,8,9,10,11,12,13].map(el=>(fac(el)+'').split('').reverse().findIndex(el=>el!= 0)));

function fac(n) {
  return n ? n * fac(n - 1) : 1;
}

рони 29.09.2017 02:44

вычислить факториал, количество нулей в конце, большие числа, разбить по три.
 
tghoster,
<script>
function diff(max, min) {
    max = max.split("").reverse();
    min = min.split("").reverse();
    var len = Math.max(max.length, min.length),
        result = [];
    for (var i = 0, b = 0, c = 0; i <= len; i++) {
        b = (+max[i] || 0) + (+min[i] || 0) + c;
        result[i] = b > 9 ? (c = 1, b - 10) : (c = 0, b)
    }
    return result.reverse().join("").replace(/^0+/, "")
}
function getFactZeros(x){
  var z = 0;
  while(x){
    x = (x/5)|0;
    z+=x;
  }
  return z;
}

function sum(x, y) {
    var res = "0";
    for (var i = 0; i < y; i++) res = diff(res, "" + x);
    return res
}
var re = /(?=\B(?:\d{3})+(?!\d+))/g;
var result = "1";
var r = 225;
for (var i = 1; i <= r; i++) {
    result = sum(result, "" + i);
    var n = result.replace(/.*?(0*$)/,"$1");
    document.write(i + " => " + result.replace(re, " ") + " => " + n + " => " + n.length +"  => " +getFactZeros(i)+ "<br><hr>")
};
</script>

рони 29.09.2017 02:54

j0hnik,
попробуй сократить свой код в 5 раз и получить тот же результат :)

j0hnik 29.09.2017 02:58

рони,
reg exp?

рони 29.09.2017 02:59

j0hnik,
холодно

j0hnik 29.09.2017 03:00

в 5??? :blink:

рони 29.09.2017 03:04

j0hnik,
да :) ну может в 6 раз меньше

j0hnik 29.09.2017 03:05

ты умеешь заинтриговать

рони 29.09.2017 03:06

j0hnik,
если по точкам в коде считать, то вместо 5 точек будет одна. :)

рони 29.09.2017 03:10

j0hnik,
это из разряда как получить сумму всех элементов восходящего ряда не суммируя каждый элемент [2,4,6,8] = 20

j0hnik 29.09.2017 03:12

в функцию всю требуху перенести? я уж думал по количеству символов в 6 раз сократить

j0hnik 29.09.2017 03:14

[8,2,3,61]
а с таким массивом будет работать?

рони 29.09.2017 03:15

j0hnik,
в нулях факториала есть период, зная его можно сразу вычислить количество нулей

рони 29.09.2017 03:16

Цитата:

Сообщение от j0hnik
[8,2,3,61]
а с таким массивом будет работать?

да

j0hnik 29.09.2017 03:16

рони, у меня 3 в школе по алгебре было, хватит издеваться =(

рони 29.09.2017 03:19

j0hnik,
осталось 4 точки поменять
alert([1,2,3,4,5,6,7,8,9,10].map(el=>el....));

рони 29.09.2017 03:20

j0hnik,
ок ... главное спокойствие :thanks:
alert([1,2,3,4,5,6,7,8,9,10].map(el=>el/5|0));

j0hnik 29.09.2017 03:27

Понятно, целая честь от деления на 5
я просто этого не знал

рони 29.09.2017 03:27

j0hnik,
для любого подобного ряда, сумма всех элементов
a = [2,4,6,8];
alert(a.length/2 * (a.shift() +  a.pop()) );

j0hnik 29.09.2017 03:31

Рони, ок. пойду спать усваивать новые знания!

SV0L0CH 29.09.2017 10:32

Цитата:

Сообщение от рони (Сообщение 465948)
alert([1,2,3,4,5,6,7,8,9,10].map(el=>el/5|0));

Если проверишь результат для значений больше 25, получишь несоответствие.
Правильное решение:
function getFactZeros(x){
  var z = 0;
  while(x){
    x = (x/5)|0;
    z+=x;
  }
  return z;
}

рони 29.09.2017 11:16

SV0L0CH,
спасибо!


Часовой пояс GMT +3, время: 14:52.