打印 n! 的结果(1 <= n <= 100)。注意:当 n > 20 时 64 位的 Int 将无法直接存储结果。

思路

  • 将大数字用 数组 形式表示。比如 987 使用 [9,8,7] 代替。
  • 每一位乘以 n,再进行进位操作,得到新数组。
let nums = [9, 8, 7]
let tmpNums = nums.map { $0 * 2 } // [18, 16, 14]

// 遍历 tmpNums 每一个数字,进行进制操作

[18, 16, 14] -> [18, 17, 4] -> [19, 7, 4] -> [1, 9, 7, 4]

print(tmpNums.map(String.init).joined()) // 1974

解答项目

func extraLongFactorials(n: Int) -> Void {
    guard n > 0 else {
        return
    }
    // 结果数组
    var result: [Int] = [1]
    for index in 1...n {
        // 数组翻转 从低位开始每一位乘以本次的数字
        let tmpNums = result.reversed().map { $0 * index }
        // 进位数
        var carryNum = 0
        // 重置结果
        result = []
        tmpNums.forEach {
            // 每一位加上上一位的进的数
            let tmpNum = $0 + carryNum
            // 向下一位进制的数
            carryNum = tmpNum / 10
            // 本位实际剩下的数 插入结果
            result.append(tmpNum % 10)
        }
        // 处理剩余进位数 进位数是可能大于 100
        while carryNum > 0 {
            // 逐渐插入进制
            result.append(carryNum % 10)
            carryNum /= 10
        }
        // 翻转回数组
        result = result.reversed()
    }
    // 连接字符串
    print(result.map(String.init).joined())
}

References

– EOF –