2015-04-06 44 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)) 
     } 
}