剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)

简介: 剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)

题目描述:

实现函数 double Power(double base, int exponent),求base的exponent次方。


注意:


1.保证base和exponent不同时为0。


2.不得使用库函数,同时不需要考虑大数问题


3.有特殊判题,不用考虑小数点后面0的位数。


数据范围: ∣base∣≤100  ,∣exponent∣≤100  ,保证最终结果一定满足∣val∣≤104

进阶:空间复杂度O(1)  ,时间复杂度O(n)  

示例:

输入:

2.00000,-2


返回值:

0.25000


说明:

2的-2次方等于1/4=0.25

解题思路:

本题考察位运算。三种解题思路。


1)暴力法


      循环累乘即可。复杂度O(n)。


2)位运算-快速幂


      对次方数进行位运算即可实现快速幂计算。复杂度O(logn)。


      如13次方是1101,分别是1、4、8,也就是说base的13次方等于base的1次方*base的4次方*base的8次方。以此为例,下面文字讲述过程便于理解。


      a)首次进入循环后,当前次方数是1101,&1可得true,result乘base,然后将base*=base,base就变成了2次方,位运算右移得到0110。


      b)第二次循环,&1得到false,也就是说当前低位是0,result不需要乘base,继续累乘base,base就变成了4次方,位运算右移得到0011。


      c)第三次循环,&1得到true,result乘base,此时的base是4次方,result就变成base的5次方,然后累乘base,base变成8次方,位运算右移得到0001。


      d)第四次循环,&1得到true,result乘base,base是8次方,result就变成了base的13次方,然后累乘base,base变成16次方,位运算右移得到0000。


      e)退出循环,返回result。

测试代码:

1)暴力法

class Solution {
public:
    double Power(double base, int exponent) {
        // 负数次方
        if(exponent < 0){
            base = 1 / base;
            exponent = -exponent;
        }
        // 累乘
        double result = 1;
        for(int i = 0; i < exponent; ++i){
            result *= base;
        }
        return result;
    }
};

2)位运算-快速幂

class Solution {
public:
    double Power(double base, int exponent) {
        // 负数次方
        if(exponent < 0){
            base = 1 / base;
            exponent = -exponent;
        }
        // 位运算实现快速幂
        double result = 1;
        while(exponent){
            if(exponent & 1){
                result *= base;
            }
            base *= base;
            exponent = exponent >> 1;
        }
        return result;
    }
};


相关文章
|
22天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
41 2
|
30天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
28天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
3月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
1032 0
高精度算法(加、减、乘、除,使用c++实现)
|
3月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
3月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
3月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
21天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
61 19
|
22天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
41 13
|
22天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
45 5