久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

在 Swift 3 中,當結果變得太高時如何計算階乘?

In Swift 3, how to calculate the factorial when the result becomes too high?(在 Swift 3 中,當結果變得太高時如何計算階乘?)
本文介紹了在 Swift 3 中,當結果變得太高時如何計算階乘?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我寫了這個函數來返回給定數字的階乘

func 階乘(_ n: Int) ->詮釋{如果 n == 0 {返回 1}別的 {返回 n * 階乘(n - 1)}}打印(階乘(20))//2432902008176640000

只要給定的數字不超過 20,就可以正常工作,因為那樣結果就太高了!

我怎樣才能繞過這個限制,從而計算更高數字的階乘?

我四處搜索并找到了一些用于 Swift 的 bignum 庫.我這樣做是為了學習和熟悉 Swift,因此我想自己解決這個問題.

解決方案

這里有一個方法可以讓你找到非常大的階乘.

將大數表示為數字數組.例如 987 將是 [9, 8, 7].將該數字乘以整數 n 需要兩個步驟.

  1. 將該數組中的每個值乘以 n.
  2. 執行進位運算以返回再次為單個數字的結果.

例如987 * 2:

讓 arr = [9, 8, 7]讓 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]

最后,為了打印,您可以將其轉換回字符串:

讓 arr = [1, 9, 7, 4]打印(arr.map(String.init).joined())

<塊引用>

1974

<小時>

應用該技術,這里有一個執行進位操作的 carryAll 函數,以及一個使用它來計算非常大的階乘的 factorial:

func carryAll(_ arr: [Int]) ->[詮釋] {var 結果 = [整數]()var 進位 = 0對于 arr.reversed() 中的 val {讓總計 = val + 進位讓數字 = 總計 % 10進位 = 總數/10結果.追加(數字)}同時攜帶>0 {讓數字 = 攜帶 % 10進位 = 進位/10結果.追加(數字)}返回結果.reversed()}func 階乘(_ n: Int)->細繩 {變量結果 = [1]對于我在 2...n {結果 = 結果.map { $0 * i }結果 = 攜帶所有(結果)}返回結果.map(String.init).joined()}打印(階乘(1000))

<塊引用>

4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869694048004799886101971960586316668729948085589013238296699445909974245040870737599188236277271887325197795059509952761208749754624970436014182780946464962910563938874378864873371191810458257836478499770124766328898359557354325131853239584630755574091142624174743493475534286465766116677973966688202912073791438537195882498081268678383745597317461360853795345242215865932019280908782973084313928444032812315586110369768013573042161687476096758713483120254785893207671691324484262361314125087802080002616831510273418279777047846358681701643650241536913982812648102130927612448963599287051149649754199093422215668325720808213331861168115536??15836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

I have written this function to return the factorial of a given number

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

print( factorial(20) )  // 2432902008176640000

Works as it should, as long the given number does not exceed 20, because then the result becomes too high!

How can I circumvent this limit and thus calculate the factorial of higher numbers?

I have searched around and found some bignum libraries for Swift. I'm doing this to learn and be familiar with Swift, therefore I want to figure this out on my own.

解決方案

Here's an approach that will let you find very large factorials.

Represent large numbers as an array of digits. For instance 987 would be [9, 8, 7]. Multiplying that number by an integer n would require two steps.

  1. Multiply each value in that array by n.
  2. Perform a carry operation to return a result that is again single digits.

For example 987 * 2:

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

Now, perform the carry operation. Starting at the one's digit, 14 is too big, so keep the 4 and carry the 1. Add the 1 to 16 to get 17.

[18, 17, 4]

Repeat with the ten's place:

[19, 7, 4]

And then with the hundred's place:

[1, 9, 7, 4]

Finally, for printing, you could convert this back to a string:

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

1974


Applying that technique, here is a carryAll function that performs the carry operation, and a factorial that uses it to calculate very large factorials:

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))

402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

這篇關于在 Swift 3 中,當結果變得太高時如何計算階乘?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Which is the best way to estimate measure of photographed things?(哪種方法是估計拍攝物體尺寸的最佳方法?)
Convert Character to Int in Swift 2.0(在 Swift 2.0 中將字符轉換為 Int)
Edit Text shows exception Invalid Int quot;quot;(編輯文本顯示異常 Invalid Int “;)
How to convert an Int to a Character in Swift(如何在 Swift 中將 Int 轉換為字符)
How to create a hex color string UIColor initializer in Swift?(如何在 Swift 中創建十六進制顏色字符串 UIColor 初始化程序?)
How to round a Double to the nearest Int in swift?(如何快速將 Double 舍入到最近的 Int?)
主站蜘蛛池模板: 我想看一级黄色毛片 | 亚洲成av人片在线观看无码 | 国产视频福利在线观看 | 欧美日韩综合 | 日本在线网站 | 视频二区在线观看 | 欧美色图另类 | 日韩精品一区二区三区在线观看 | 欧美成人在线网站 | 国产精品爱久久久久久久 | 日韩国产欧美 | 亚洲电影一区二区三区 | 国产综合久久 | 精品国产欧美一区二区三区不卡 | 国产一区在线免费观看 | 欧美一区二区三区视频 | 人妖videosex高潮另类 | 午夜一级做a爰片久久毛片 精品综合 | 看毛片的网站 | 亚洲一区亚洲二区 | 91久久精品国产免费一区 | 欧美性生活网 | 亚洲一区二区三区四区五区中文 | gogo肉体亚洲高清在线视 | 国产精品久久久久久久粉嫩 | 亚洲欧美成人在线 | 欧美精品久久久久久久久久 | 亚洲福利在线观看 | 国产中文在线观看 | 亚洲精品一区二区在线观看 | 6996成人影院网在线播放 | 一级特黄在线 | 九九免费观看视频 | 日韩电影一区二区三区 | 亚洲欧美中文日韩在线 | 国产美女自拍视频 | 日韩中文字幕一区二区 | 亚洲精品中文字幕在线观看 | 成人精品鲁一区一区二区 | a在线观看免费 | 成人欧美一区二区三区黑人孕妇 |