base的exponent次方

此题面试时常有:

解答方法有以下三种:

1.递归求解 复杂度O(n)
    这个太水了....
double Power(double base,int exponent)
{
    double result =1;
    for(int i=1;i<=exponent;i++)
        result*=base;
    return result;
}



2.递归-分治法,复杂度为   logn
计算机科学 中, 分治法 是建基于多项分支 递归 的一种很重要的算法 范式 。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

1。 n为偶数  那么 an= (a*a)n/2 

2。n为奇数 那么  an=  a*an-1


double Power(double base,int exponent)
{
    double result;
    if(exponent==1)
        return base;
    else
        {
            result=Power(base,exponent/2);
            if(exponent%2==0)               
                return result*result;
            else
                return result*result*base;
        }
}



3.此方法复杂度为 n的二进制表示中最高位1的index

原理为:事先建立a的 2m为(0,x);的表。指导找到一个最小的x使得 n<2X然后 利用a中二进制位的位置和个数信息得到最终结果


const int MAX=32;

double Power(double base,int exponent)
{
    if (base == 1  )
    {
        return 1;
    }
    if (base ==0)
    {
        if (base == 0)
            return -1;
        return 1 ;
    }
    double table[MAX];
    table[0] = base;
    for (int i = 1;i<MAX && i<exponent;i++)
    {
        table[i] = table[i-1]*table[i-1];
    }
    int i = 0;
    double m = 1;
    while ( exponent>>i)
    {
        if(1&exponent>>i)
            m = m *table[i];
        i++;
    }
    return m;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值