Не знаете о «официальном» способе его чтения, но если MANIFEST.MF не может быть правильно загружен в качестве ресурса, как насчет того, чтобы попытаться получить свой путь от «ServletContext.getRealPath ()» на какой-либо веб-путь, определенный в вашем приложении?
Написание версии приложения также в другое место (файл свойств в WEB-INF / classes) муравей во время сборки - другое решение, которое приходит мне на ум.
Вот такой подход, который позволит вам найти очень большие факториалы.
Представляют большие числа в виде массива цифр. Например, 987
будет [9, 8, 7]
.
n
. Умножить каждое значение в этом массиве на n
. Например 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
blockquote>
Применяя эту технику, здесь есть функция
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
blockquote>
Вы можете использовать эту библиотеку: 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