给定数字N,找出该数字中有多少位数是有用的。如果数字可以被该数字整除,则数字中的数字很有用

时间:2016-05-19 22:51:25

标签: swift traversal

我已经为此工作了2天。

这就是我所拥有的:

func selfDivide(integer: Int) -> Int {
    var numString = String(integer)
    for character in numString.characters {
        if character % numString == 0 {
            return character
        }
    }
}

我想我必须找到一种在字符串和字符之间使用%的方法。

我得到的错误是:

二元运营商'%'不能应用于类型'字符'和'字符串'

5 个答案:

答案 0 :(得分:16)

以下是使用扩展程序的更多Swifty方式( Swift 4 + ):

public extension Int {
/// returns number of digits in Int number
public var digitCount: Int {
    get {
        return numberOfDigits(in: self)
    }
}
/// returns number of useful digits in Int number
public var usefulDigitCount: Int {
    get {
        var count = 0
        for digitOrder in 0..<self.digitCount {
            /// get each order digit from self
            let digit = self % (Int(truncating: pow(10, digitOrder + 1) as NSDecimalNumber))
                / Int(truncating: pow(10, digitOrder) as NSDecimalNumber)
            if isUseful(digit) { count += 1 }
        }
        return count
    }
}
// private recursive method for counting digits
private func numberOfDigits(in number: Int) -> Int {
    if number < 10 && number > 0 || number > -10 && number < 0 {
        return 1
    } else {
        return 1 + numberOfDigits(in: number/10)
    }
}
// returns true if digit is useful in respect to self
private func isUseful(_ digit: Int) -> Bool {
    return (digit != 0) && (self % digit == 0)
}

}

用法:

print(333444.digitCount)
print(333444.usefulDigitCount)

答案 1 :(得分:4)

我建议您使用Int完成所有工作,而不是转换为String。您可以使用% 10获取数字,使用/ 10删除最后一位数。

func selfDivide(number: Int) -> Int {
    var num = abs(number)
    var count = 0
    while num > 0 {
        let digit = num % 10
        if digit != 0 && number % digit == 0 {
            count += 1
        }
        num = num / 10
    }
    return count
}

答案 2 :(得分:1)

在while循环的单次迭代中,该函数将计算出数字的最后一位,并检查数字的最后一位(如果不等于0)以及该数字是否可被该数字整除(如果结果为true,然后将计数加1。最后一行从数字中删除最后一位。重复相同的过程,直到数字大于0。最后,最后返回有效数字。

extension Int {

func usefulNumCount() -> Int {
        var count = 0
        var num = abs(self)
        while num > 0 {
            let remainder = num % 10
            if remainder != 0 && self % remainder == 0 {
                count += 1
            }
            num = num / 10
        }
        return count
    }

}

答案 3 :(得分:0)

这对我来说只有无符号整数才有意义。

如果你有进一步的想法来敲我,请告诉我;我往往需要它。

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

  func usefulDigitCount(radix: Self = 10) -> Int {
    digits(radix: radix).filter(isMultiple).count
  }
}

答案 4 :(得分:-1)

在 Swift 5 中

extension BinaryInteger {
  var digits: [Int] {
    return String(describing: self).compactMap { Int(String($0)) }
  }
}

extension Int {
  public var digitCount: Int {
   get {
    return self.digits.count
   }
  }
}

extension Int {
  var usefulDigits: Int {
    var count = 0
    for digit in self.digits {
        if digit != 0 && self % digit == 0 {
            count += 1
        }
    }
    return count
  }
}