2015-04-06 68 views
1

有誰知道如何獲得Swift中數字的所有數字的總和?使用數字845會導致17在Swift中查找數字的總數

+3

除以10,加上餘數到運行總數,再以商數重複到零。你有什麼嘗試? – Amadan 2015-04-06 06:36:53

回答

8

這裏是僅使用簡單的整數運算的溶液:

func digitSum(var n : Int) -> Int { 
    var sum = 0 
    while n > 0 { 
     sum += n % 10 // Add least significant digit ... 
     n /= 10 // ... and remove it from the number. 
    } 
    return sum 
} 

println(digitSum(845)) // 17 

更新夫特3/4:

func digitSum(_ n : Int) -> Int { 
    var n = n 
    var sum = 0 
    while n > 0 { 
     sum += n % 10 // Add least significant digit ... 
     n /= 10 // ... and remove it from the number. 
    } 
    return sum 
} 

print(digitSum(845)) // 17 

另一個實行,只是爲了好玩:斯威夫特3

func digitSum(_ n : Int) -> Int { 
    return sequence(state: n) { (n: inout Int) -> Int? in 
      defer { n /= 10 } 
      return n > 0 ? n % 10 : nil 
     }.reduce(0, +) 
} 
+0

這與我昨晚從我的字典問題的第二部分需要的東西類似。我已經更進了一步,將其縮小到一位數字,但不接受字符串。當你有一分鐘​​時,你能否看看並提出變體建議?非常感謝。 https://stackoverflow.com/questions/48512102/sum-integers-using-key-values-from-a-characterint-dictionary-to-one-digit – tymac 2018-01-30 00:22:49

1

爲了完整起見

例如,對於那些希望看到或理解數學爲基礎的方法是誰,這裏是移植到一個實數函數爲基礎的技術迅速。

這是不是在Swift中計算整數數字的最有效方法。我不推薦使用它。我個人會使用@LeoLDbus map/reduce來回答這個問題,因爲它非常酷,並且說明了一組強大的Swift特性但很短,或者說@MartinR整數mod/divide答案,由於它的整數運算的極其簡單和相對速度。

Cocoa和UIKit擁有必要的數學方法,所以您可能需要導入其中一個包。

func sumDigits(var i : Int) -> Int { 
    var sum = 0 
    var nDigits = floor(log10(Double(i))) + 1 
    for var r = nDigits; r > 0; r-- { 
     var p = pow(10, r - 1) 
     var d = floor(Double(i)/p) 
     sum += Int(d) 
     i -= Int(d * p) 
    } 
    return sum 
} 
9

更新:的Xcode 8.3.2•夫特3.1

let myString = "845" 
let sum = myString.characters.flatMap{Int(String($0))}.reduce(0, +) 
print(sum) // 17 

let myInteger = 845 
let sumInt = String(myInteger).characters.flatMap{Int(String($0))}.reduce(0, +) 
print(sumInt) // 17 
+1

不錯。非常Swiftesque!這讓我看起來陣列,地圖,減少和使用它在操場上。我現在明白了。值得學習。有一天你會成爲我的榜樣,這會爲我節省一些時間! – clearlight 2015-04-06 07:18:39

+0

@所有關於該基地謝謝 – 2015-04-06 07:27:02

2

遞歸的解決方案!

func digitSum(of number: Int) -> Int 
{ 
if(number < 10) 
    { 
    return number 
    } 
    else 
     { 
     return number % 10 + digitSum(of: (number/10)) 
     } 
}