let string = "845"
let sum = string.compactMap(\.wholeNumberValue).reduce(0, +)
print(sum) // 17
let integer = 845
let sumInt = String(integer).compactMap(\.wholeNumberValue).reduce(0, +)
print(sumInt) // 17
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
Swift 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
另一个实现,只是为了好玩:
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, +)
}
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
}
public extension UnsignedInteger {
/// The digits that make up this number.
/// - Parameter radix: The base the result will use.
func digits(radix: Self = 10) -> [Self] {
sequence(state: self) { quotient in
guard quotient > 0
else { return nil }
let division = quotient.quotientAndRemainder(dividingBy: radix)
quotient = division.quotient
return division.remainder
}
.reversed()
}
}
XCTAssertEqual(
(867_5309 as UInt).digits(),
[8,6,7, 5,3,0,9]
)
XCTAssertEqual(
(0x00_F0 as UInt).digits(radix: 0b10),
[1,1,1,1, 0,0,0,0]
)
XCTAssertEqual(
(0xA0_B1_C2_D3_E4_F5 as UInt).digits(radix: 0x10),
[10,0, 11,1, 12,2, 13,3, 14,4, 15,5]
)
XCTAssertEqual(
(0o00707 as UInt).digits(radix: 0o10),
[0b111, 0, 0b111]
)
6条答案
按热度按时间iyzzxitl1#
更新:
Swift 5或更高版本我们可以使用新的Character属性
wholeNumberValue
:Swift 5.2或更高版本我们可以使用新的Key Path Expressions as Functions
mwngjboj2#
下面是一个仅使用简单整数运算的解决方案:
Swift 3/4更新:
另一个实现,只是为了好玩:
6ss1mwsb3#
Swift 3中的递归解决方案!
o4tp2gmn4#
为了完整起见,对于那些希望看到或理解基于数学的方法的人,这里有一个基于实数函数的技术移植到Swift。
这不是Swift中计算整数位数最有效的方法。我不推荐使用它。我个人会使用@LeoLDbus map/reduce回答这个问题,因为它太酷了,说明了一组强大的Swift功能,但很短,或者@MartinR integer mod/divide回答,因为它非常简单,而且整数运算速度相对较快。
pdtvr36n5#
对于swift4,请尝试以下函数:
t9aqgxwy6#
把它分成两部分:
digits
sum
一个一个二个一个一个一个三个一个一个一个一个一个四个一个