Swift 4 - Точное получение больших факториалов на игровых площадках [дубликат]

Не знаете о «официальном» способе его чтения, но если MANIFEST.MF не может быть правильно загружен в качестве ресурса, как насчет того, чтобы попытаться получить свой путь от «ServletContext.getRealPath ()» на какой-либо веб-путь, определенный в вашем приложении?

Написание версии приложения также в другое место (файл свойств в WEB-INF / classes) муравей во время сборки - другое решение, которое приходит мне на ум.

3
задан Jon 7 May 2017 в 10:00
поделиться

2 ответа

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

Представляют большие числа в виде массива цифр. Например, 987 будет [9, 8, 7].

  1. Умножить это число на целое число n. Умножить каждое значение в этом массиве на n.
  2. Выполнить операцию переноса, чтобы вернуть результат это опять-таки одиночные цифры.

Например 987 * 2:

let arr = [9, 8, 7]
let arr2 = arr.map { $0 * 2 }
print(arr2)  // [18, 16, 14]

Теперь выполните операцию переноса. Начиная с одной цифры, 14 слишком велик, поэтому держите 4 и несите 1. Добавьте 1 в 16, чтобы получить 17.

[18, 17, 4]

Повторите с десяти места:

[19, 7, 4]

И затем со сто:

[1, 9, 7, 4]

Наконец, для печати вы можете преобразовать это обратно в строку:

let arr = [1, 9, 7, 4]
print(arr.map(String.init).joined())

1974


Применяя эту технику, здесь есть функция carryAll, которая выполняет операцию переноса, и factorial, которая использует ее для вычисления очень больших факториалов:

func carryAll(_ arr: [Int]) -> [Int] {
    var result = [Int]()

    var carry = 0
    for val in arr.reversed() {
        let total = val + carry
        let digit = total % 10
        carry = total / 10
        result.append(digit)
    }

    while carry > 0 {
        let digit = carry % 10
        carry = carry / 10
        result.append(digit)
    }

    return result.reversed()
}



func factorial(_ n: Int) -> String {
    var result = [1]
    for i in 2...n {
        result = result.map { $0 * i }
        result = carryAll(result)
    }

    return result.map(String.init).joined()
}

print(factorial(1000))

7671691324484262361314125087802080002616831510273418279777047846358681701643650241536913982812648102130927612448963599287051149649754199093422215668325720808213331861168115536158365469840467089756029009505376164758477284218896796462449451607653534081989013854424879849599533191017233555566021394503997362807501378376153071277619268490343526252000158885351473316117021039681759215109077880193931781141945452572238655414610628921879602238389714760885062768629671466746975629112340824392081601537808898939645182632436716167621791689097799119037540312746222899880051954444142820121873617459926429565817466283029555702990243241531816172104658320367869061172601587835207515162842255402651704833042261439742869330616908979684825901254583271682264580665267699586526822728070757813918581788896522081643483448259932660433676601769996128318607883861502794659551311565520360939881806121385586003014356945272242063446317974605946825731037900840244324384656572450144028218852524709351906209290231364932734975655139 5872055965422874977401141334696271542284586237738753823048386568897646192738381490014076731044664025989949022222176590433990188601856652648506179970235619389701786004081188972991831102117122984590164192106888438712185564612496079872290851929681937238864261483965738229112312502418664935314397013742853192664987533721894069428143411852015801412334482801505139969429015348307764456909907315243327828826986460278986432113908350621709500259738986355427719674282224875758676575234422020757363056949882508796892816275384886339690995982628095612145099487170124451646126037902930912088908694202851064018215439945715680594187274899809425474217358240106367740459574178516082923013535808184009699637252423056085590370062427124341690900415369010593398383577793941097002775347200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000

6
ответ дан vacawama 17 August 2018 в 09:50
поделиться
  • 1
    Хороший и дополнительный ответ, большое вам спасибо – Jon 7 May 2017 в 11:24

Вы можете использовать эту библиотеку: BigInt

Установите его с помощью CocoaPods:

pod 'BigInt'

Тогда вы можете использовать его следующим образом:

import BigInt

    func factorial(_ n: Int) -> BigInt {
        if n == 0 {
            return 1
        }
        else {
            return BigInt(n) * factorial(n - 1)
        }
    }

    print( factorial(50) )  // 30414093201713378043612608166064768844377641568960512000000000000
0
ответ дан Anton Novoselov 17 August 2018 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: