个位数自定义幂函数
直接上代码了 ,不废话了
// 三个参数 底数 幂指数 结果位数
func maxPow(number:Int, powIndex:Int,rangeNumber:Int) {
// 我们需要计时,看看需要多久
let startTime = CFAbsoluteTimeGetCurrent()
// 定义保存数据的空间大小
let arrLength = rangeNumber
// 从0开始遍历整个空间
let rangeLength = arrLength - 2
// 初始化结果 , 除了以第一位是1之外,其他都是 0
var arr = Array<Int>(repeating: 0, count: arrLength)
// 任何非0数的 0次幂是 1
arr[0] = 1
// 初始化 进位
var jw = Array<Int>(repeating: 0, count: arrLength)
// 定义幂指数
let powNumber = powIndex
// 系统有 幂函数公式我们看下系统的计算结果
print("System.math == \(pow(Decimal(number), powIndex))")
// 开始幂运算了 , 多少次幂运算就 有多少次循环
for _ in 1...powNumber {
// 每循环移位 ,都要✖️ 底数
for i in 0...rangeLength {
// 在第 i 位 ,相当于当前的数值 X 底数 + 当前的进位
// 若超过了 10 ,就要向前进位
let aiValue = arr[i] * number + jw[i]
// 对10 求余数 , 并代替之前的值
let v1 = aiValue % 10
// 获取进位
let v2 = aiValue / 10
// 余数给当前位数
arr[i] = v1
// 进位给下一位
jw[i+1] = v2
}
}
// 格式化计算结果
let numRusult = NSMutableString()
// 加一个标记为
var start:Bool = false
// 翻转数组,最高位在最后面
for item in arr.reversed() {
if item != 0 && !start {
start = true
}
// 把每一位拼接起来
if start {
numRusult.append("\(item)")
}
}
// 我们需要计时,看看需要多久
let endTime = CFAbsoluteTimeGetCurrent()
print("用时 : \(endTime-startTime) ")
// 结果输出
print("\(number) ^ \(powNumber) === \(numRusult)")
}
//调用看看
// 2的十次方
/*
用时 : 217.8534220457077
2 ^ 100000 ===
*/
maxPow(number: 2, powIndex: 100, rangeNumber: 40)