我怎样才能找到给定数字 N 中有多少个有用的数字

How can I find how many useful digits are in any given a number N

如果数字可以被该数字整除,则数字中的数字很有用。

我已经为此工作了 2 天了。

这是我的资料:

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

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

我得到的错误是:

二元运算符“%”不能应用于 'Character' 和 'String'

类型的字符

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

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

extensionInt 的回答相同:

extension Int {
    var usefulDigits: Int {
        var num = self
        var count = 0
        while num != 0 {
            let digit = abs(num % 10)
            if digit != 0 && self % digit == 0 {
                count += 1
            }
            num = num / 10
        }
        return count
    }
}

示例:

print(100.usefulDigits)      // 1
print(123.usefulDigits)      // 2
print(222.usefulDigits)      // 3
print(299.usefulDigits)      // 0
print(Int.max.usefulDigits)  // 4
print(Int.min.usefulDigits)  // 7

这里有更多 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)

在while循环的单次迭代中,函数将计算出数字的最后一位,并检查数字的最后一位是否不等于0以及数字是否可以被该数字整除,如果结果为真,则计数加 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
    }

}

在Swift5

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

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

这只对无符号整数有意义。

如果你有进一步的意识来敲我,请告诉我;我倾向于需要它。

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