Почему в конце факторных чисел слишком много нулевых цифр - PullRequest
0 голосов
/ 02 января 2019

У меня интересный вопрос, речь идет не о программировании, может быть, о математике.

Это простой код на Scala - факторный номер

def smartFactorial(number: Int): BigInt = {
  def factorial(number: Int, accumulator: BigInt) : BigInt = {
    if (number <= 1) accumulator
    else
      factorial(number - 1, number * accumulator)
  }

  factorial(number, 1)
}
println(smartFactorial(1000))

Итак, когда я запускаюэтот код впервые я получил результат с большим количеством нулевых цифр на конце.Во-первых, я подумал «это ошибка» и попытался запустить этот код с другими параметрами (также более 1000) - результаты были одинаковыми.После нескольких поисков по этому вопросу я совершенно не могу решить: Почему итоговое число факториалов имеет слишком много нулевых цифр на конце и как мы можем это объяснить?

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

  def countOfEndZeros(number: String): Int = {
    def countOfEndZeros(number: String, index: Int, accumulator: Int) : Int = {
      if (number.charAt(index) != '0') accumulator
      else if (index - 1 < 0) accumulator
      else countOfEndZeros(number.substring(0, index), index - 1, accumulator + 1)
    }

    countOfEndZeros(number, number.length - 1, 0)
  }

  val countExamples = 1000
  val inputs: Stream[Int] = Stream.from(1)

  inputs
    .map(i => (i, factorial(i).toString()))
    .map(t => (t._1, countOfEndZeros(t._2)))
    .take(countExamples)
    .foreach(println)

Интересный факт: если вы запустите последний скрипт, вы увидите, что на 5конец, но все остальные цифры представлены.Я не могу понять это или объяснить это;может быть, есть математические теоремы, которые могут это объяснить?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

В любом факториале доступно множество 2-х, поэтому каждые 5, которые у вас есть, будут добавлять трейлинг 0. Однако, кратные старшим степеням 5 (например, 25, 50, ...) дают вам больше трейлингов 0. Это то, что вы заметили: 20! через 24! есть 4 конечных 0, но 25! имеет 6 конечных 0, потому что 25 равно 5 * 5, что добавляет два конечных 0.

0 голосов
/ 02 января 2019

Большие факториалы имеют много нулей по двум основным причинам.

  • Они состоят из множества чисел, оканчивающихся на ноль. Подумайте обо всех числах, таких как 10, 20, 30 и т. Д., Которые вы умножили на множитель 1000, чтобы получить ответ. Каждое из этих значений добавляет 0 (два ноля для 100, 200 и т. Д.), Так как любое число, умноженное на 10, заканчивается 0.

  • Они также состоят из множества чисел, кратных 2 или 5. Поскольку 2 * 5 = 10, вы можете добавить ноль в конец факториала для каждого кратного 2 и 5, находятся в его расширении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...