Как быстро напечатать все цифры в большом количестве 10 степени 25?

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

func extraLongFactorials(n: Int) -> Void {
    let factorialNumber = factorial(number: n)

    var arrayForStorage: [Int] = []

    var loop = factorialNumber
    while (loop > 0) {
       let digit = loop.truncatingRemainder(dividingBy: 10)

       arrayForStorage.append(Int(digit))

       loop /= 10
    }

    arrayForStorage = arrayForStorage.reversed()
    var returnString = ""
    for element in arrayForStorage {
       returnString = "\(returnString)\(element)"
    }

    print(returnString)
}

func factorial(number: Int) -> Double {
    if number == 0 || number == 1 {
       return 1
    } else if number == 2 {
       return 2
    } else {
       return Double(number) * factorial(number: number - 1)
    }
}

Но когда я пытаюсь напечатать номер факториала, он просто печатает 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015511210043330982408266888, когда должен печатать 15511210043330985984000000.

Я думаю, что метод Double number truncatingRemainder(dividingBy: 10) не дает мне точного числа остатка. Потому что, когда я попытался напечатать truncatingRemainder 15511210043330985984000000, он выдал мне 8. Вот код.

let number: Double = 15511210043330985984000000
print(number.truncatingRemainder(dividingBy: 10))

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


person Shreesha Kedlaya    schedule 08.06.2018    source источник
comment
stackoverflow.com/a/43830823/1630618   -  person vacawama    schedule 08.06.2018
comment
спасибо за предложение @vacawama   -  person Shreesha Kedlaya    schedule 08.06.2018
comment
Могу ли я сделать ваш вопрос дубликатом этого вопроса, или вам все еще нужна дополнительная информация о том, почему ваш подход не работает?   -  person vacawama    schedule 08.06.2018
comment
Я хочу знать, почему truncatingRemainder не работает должным образом для большого числа.   -  person Shreesha Kedlaya    schedule 08.06.2018


Ответы (1)


Тип Double хранит число как mantissa и exponent. mantissa представляет значащие цифры числа, а exponent представляет величину числа. Double может представлять только около 16 значащих цифр, а ваше число состоит из 26 цифр, поэтому вы не можете точно хранить 15511210043330985984000000 в Double.

let number1: Double = 15511210043330985984000000
let number2: Double = 15511210043330985984012345

if number1 == number2 {
    print("they are equal")
}
they are equal

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

person vacawama    schedule 08.06.2018
comment
Спасибо за ответ. - person Shreesha Kedlaya; 08.06.2018