程序猿阵线联盟-汇总各类技术干货

实现base的exponent次方,不考虑大数问题

2017-11-20  本文已影响0人  沧州宁少

实现base的exponent次方,不考虑大数问题

我们第一反应的是进行n次遍历。相乘得到结果

 func reduce(base:Double,exponent:Int)->Double{
   
  var result = base 
 return (1...expoent).forEach({result* = result})
 }

上面代码是我们最容易想到的代码但是会有很多问题。没有考虑传入0<x<1和x<1的情况

    double Power(double base,int exponent){

    if (base == 0) {
    return  0;
    }

    int absexponent = abs(exponent);

    double result = PowerWithUnsignedExponent(base,  absexponent);
  
    if (exponent<0) {

    result = 1/result;
    
    }  

     return  result
   
    }

加入了exponent 小于0和大于0小于1的判断。但是正常的值拿result的时候时间复杂度依然为O(n)

double PowerWithUnsignedExponent(double base,int exponent){

if (exponent == 0) {
    return 1;
}
if (exponent == 1) {
    return base;
}
double result = PowerWithUnsignedExponent(base, exponent>>1);
result*= result;
//判断是否是奇数,如果是奇数则乘以base
if ((exponent & 0x1) == 1) {
    return result*=base;
}
return result;
}

这样时间复杂度为O(lgn).

上一篇 下一篇

猜你喜欢

热点阅读