在Swift中查找数字的数字和

ruyhziif  于 2023-04-04  发布在  Swift
关注(0)|答案(6)|浏览(159)

有人知道如何在Swift中获得一个数字中所有数字的总和吗?
例如,使用数字845将得到17

iyzzxitl

iyzzxitl1#

更新:

Swift 5或更高版本我们可以使用新的Character属性wholeNumberValue
Swift 5.2或更高版本我们可以使用新的Key Path Expressions as Functions

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
mwngjboj

mwngjboj2#

下面是一个仅使用简单整数运算的解决方案:

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, +)
}
6ss1mwsb

6ss1mwsb3#

Swift 3中的递归解决方案!

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

o4tp2gmn4#

为了完整起见,对于那些希望看到或理解基于数学的方法的人,这里有一个基于实数函数的技术移植到Swift。
这不是Swift中计算整数位数最有效的方法。我不推荐使用它。我个人会使用@LeoLDbus map/reduce回答这个问题,因为它太酷了,说明了一组强大的Swift功能,但很短,或者@MartinR integer mod/divide回答,因为它非常简单,而且整数运算速度相对较快。

  • 可可和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
}
pdtvr36n

pdtvr36n5#

对于swift4,请尝试以下函数:

func sumDigits(num: Int) -> Int {
    return String(num).compactMap { Int(String($0)) }.reduce(0, +)
}
t9aqgxwy

t9aqgxwy6#

把它分成两部分:

  1. digits
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]
)
  1. sum
    一个一个二个一个一个一个三个一个一个一个一个一个四个一个

相关问题