程序员面试题精选100题(44)-数值的整数次方

2023-10-31

程序员面试题精选100题(44)-数值的整数次方
题目:实现函数double Power(double base, int exponent),求baseexponent次方。不需要考虑溢出。
方法一:
由于输入的exponent是个int型的数值,因此可能为正数,也可能是负数。
见下面代码:
bool g_InvalidInput=false;
double Power(double base,int exponent)
{
  g_InvalidInput=false;
  if(base==0&&exponent<0)
  {
    g_InvalidInput=true;
return 0.0;
  }
  unsigned int unsignedExponent=static_cast<unsigned int>(exponent);
  if(exponent<0)
     unsigned int unsignedExponent=static_cast<unsigned int>(-exponent);
  double result=PowerWithUnsignedExponent(base,unsignedExponent);
  if(exponent<0)
 result=1.0/result;
  return result;
}
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
  double result=1.0;
  for(int i=1;i<=exponent;i++)
 result*=base;
  return result;
}
方法二:

如果我们输入的指数exponent32,按照前面的算法,我们在函数PowerWithUnsignedExponent中的循环中至少需要做乘法31次。但我们可以换一种思路考虑:我们要求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样以此类推,我们求32次方只需要做5次乘法:求平方,在平方的基础上求4次方,在4次方的基础上平方求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。

32刚好是2的整数次方。如果不巧输入的指数exponent不是2的整数次方,我们又该怎么办呢?我们换个数字6来分析,6就不是2的整数次方。但我们注意到6是等于2+4,因此我们可以把一个数的6次方表示为该数的平方乘以它的4次方。于是,求一个数的6次方需要3次乘法:第一次求平方,第二次在平方的基础上求4次方,最后一次把平方的结果和4次方的结果相乘。

现在把上面的思路总结一下:把指数分解了一个或若干个2的整数次方。我们可以用连续平方的方法得到以2的整数次方为指数的值,接下来再把每个前面得到的值相乘就得到了最后的结果。

到目前为止,我们还剩下一个问题:如何将指数分解为一个或若干个2的整数次方。我们把指数表示为二进制数再来分析。比如6的二进制表示为110,在它的第2位和第3位为1,因此6=2^(2-1)+2^(3-1) 。也就是说只要它的第n位为1,我们就加上2n-1次方。

最后,我们根据上面的思路,重写函数PowerWithUnsignedExponent

代码为:
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
std::bitset<32> bits(exponent);
if(bits.none())
return 1.0;
int numberOf1=bits.count();
    double multiplication[32];
for(int i=0;i<32;i++)
{
multiplication[i]=1.0;
}
int count=0;
double power=1.0;
    for(int i=0;i<32&&count<numberOf1;i++)
{
 if(i==0)
 power=base;
 else
 power=power*power;
 if(bits.at(i))
 {
   multiplication[i]=power;
 }
}
power=1.0;
for(int i=0;i<32;i++)
{
 if(bits.at(i))
 power*=multiplication[i];
}
return power;
}
在上述代码中,我们用C++的标准函数库中bitset把整数表示为它的二进制,增大代码的可读性。如果exponent的第i位为1,那么在数组multiplication的第i个数字中保存以base为底数,以2i次方为指数的值。最后,我们再把所以位为1在数组中的对应的值相乘得到最后的结果。
方法三:

上面的代码需要我们根据base的二进制表达的每一位来确定是不是需要做乘法。对二进制的操作很多人都不是很熟悉,因此编码可能觉得有些难度。我们可以换一种思路考虑:我们要求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样以此类推,我们求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上平方求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。

也就是说,我们可以用如下公式求an次方:

程序员面试题精选100题(44)-数值的整数次方 - 何海涛 - 微软、Google等面试题

这个公式很容易就能用递归来实现。新的PowerWithUnsignedExponent代码如下:

double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
  if(exponent==0)
 return 1;
  if(exponent==1)
 return base;
  double result=PowerWithUnsignedExponent(base,exponent>>1);
  result*=result;
  if(exponent&0x1==1)
 result*=base;
  return result;
}
参考:<<剑指offer名企面试官精讲典型编程题>>-----何海涛
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员面试题精选100题(44)-数值的整数次方 的相关文章

  • 字节跳动第五届青训营后端练习题——分割ip(Java版)

    题目 有效 IP 地址正好由四个整数 每个整数位于 0 到 255 之间组成 且不能含有前导 0 整数之间用 分隔 例如 0 1 2 201 和 192 168 1 1 是有效 IP 地址 但是 0 011 255 245 192 168
  • 程序员面试题精选100题(35)-两链表的第一个公共结点

    程序员面试题精选100题 35 两链表的第一个公共结点 题目 两个单向链表 找出它们的第一个公共结点 链表的结点定义为 struct ListNode int m nKey ListNode m pNext 分析 这是一道微软的面试题 微软
  • 程序员面试题精选100题(41)-把数组排成最小的数

    程序员面试题精选100题 41 把数组排成最小的数 题目 输入一个正整数数组 将它们连接起来排成一个数 输出能排出的所有数字中最小的一个 例如输入数组 32 321 则输出这两个能排成的最小数字32132 请给出解决问题的算法 并证明该算法
  • 【NOIP 2004 提高组】合并果子

    题就自己找啦 各大OJ上应该都有 题目 题目描述 在一个果园里 多多已经将所有的果子打了下来 而且按果子的不同种类分成了不同的堆 多多决定把所有的果子合成一堆 每一次合并 多多可以把两堆果子合并到一起 消耗的体力等于两堆果子的重量之和 可以
  • 几种常用激活函数的简介

    1 sigmod函数 函数公式和图表如下图 在sigmod函数中我们可以看到 其输出是在 0 1 这个开区间内 这点很有意思 可以联想到概率 但是严格意义上讲 不要当成概率 sigmod函数曾经是比较流行的 它可以想象成一个神经元的放电率
  • 程序员面试题精选100题(43)-n个骰子的点数

    程序员面试题精选100题 43 n个骰子的点数 题目 把n个骰子扔在地上 所有骰子朝上一面的点数之和为S 输入n 打印出S的所有可能的值出现的概率 分析 玩过麻将的都知道 骰子一共6个面 每个面上都有一个点数 对应的数字是1到 6之间的一个
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i
  • 程序员面试题精选100题(44)-数值的整数次方

    程序员面试题精选100题 44 数值的整数次方 题目 实现函数double Power double base int exponent 求base的exponent次方 不需要考虑溢出 方法一 由于输入的exponent是个int型的数值
  • 线性时间内从一个数组中找出第K个最小的元素——编程珠玑

    线性时间内从一个数组中找出第K个最小的元素 编程珠玑 题目 编写程序 在O n 时间内从数组x 0 n 1 中找出第k个最小的元素 算法中可以对x中的元素进行排序 思路 快速排序选择一个pivot对数组进行划分 左边小于pivot 右边大于
  • 算法设计艺术——编程珠玑第八章

    算法设计艺术 编程珠玑第八章 下面是书本中讲解的四个算法 问题 求一维数组中连续子向量的最大和 例如 a 6 3 4 2 9 10 8 则最大连续子向量的和 为 10 8 18 1 解法一 简单算法 html view plain copy
  • 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

    图的邻接矩阵表示 通常图的表示有两种方法 邻接矩阵 邻接表 本文用邻接矩阵实现 一是代码量更少 二是代码风格也更贴近C语言 但不论是图的哪种实现方式 其基本的实现思想是不变的 1 节点的信息 我们用一维数组a n 来存储 假设图共有n个节点
  • 编写一个"banner"函数,该函数的输入为大写字母

    编写一个 banner 函数 该函数的输入为大写字母 题目 编写一个 banner 函数 该函数的输入为大写字母 输出为一个字符数组 该数组以图像化的方式表示该字母 编程 珠玑 上提到当要 输入 的 数据 很多 且没有 规律 时 可以 考虑
  • strassen矩阵乘法

    Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下 两个n n 阶的矩阵A与B的乘积是另一个n n 阶矩阵C C可表示为假如每一个C i j 都用此公式计算 则计算C所需要的操作次数为n3 m n2 n 1 a 其中m表
  • 程序员面试题精选100题(04)-二元树中和为某一值的所有路径

    程序员面试题精选100题 04 二元树中和为某一值的所有路径 题目 输入一个整数和一棵二元树 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径 打印出和与输入整数相等的所有路径 例如输入整数22和如下二元树 10 5 12
  • 枚举子集复杂度 O(n^3) 证明

    困扰多年的问题 居然在学习离散数学后的一分钟内得到解决 形式化问题为 求满足 A B S A sube B sube S A B S 的有序对
  • 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点

    程序员面试题精选100题 48 二叉树两结点的最低共同父结点 题目 二叉树的结点定义如下 struct TreeNode int m nvalue TreeNode m pLeft TreeNode m pRight 输入二叉树中的两个结点
  • c++二分查找—来自编程珠玑

    c 二分查找 来自编程珠玑 二分查找法 Binary search algorithm 是一个很常见的算法 从 编程珠玑 里再次看到时又有新的收获 直接看代码吧 下面是常见的实现代码 int binary search int a int
  • 中文分词之HMM模型详解

    关于HMM模型的介绍 网上的资料已经烂大街 但是大部分都是在背书背公式 本文在此针对HMM模型在中文分词中的应用 讲讲实现原理 尽可能的撇开公式 撇开推导 结合实际开源代码作为例子 争取做到雅俗共赏 童叟无欺 没有公式 就没有伤害 模型介绍
  • 贪心算法——排队打水问题

    6 3 排队打水问题 有n个人排队到r个水龙头去打水 他们装满水桶的时间为t1 t2 tn为正整数且个不相等 应如何安排他们打水顺序才能使他们花费的时间最少 算法分析 时间总和 等待时间 装水时间 采用贪心思想 先sort 默认将装水时间从
  • 归并排序(分析与模板)

    归并排序 思路 1 确定分界元素mid left right 2 2 递归分解数组 两两组合组成两个有序数组 3 归并 合二为一 int temp 100010 merge sort int num int l int r if l gt

随机推荐

  • 关于CLion有时找不到标准库的解决方案

    关于CLion有时找不到标准库的解决方案 CLion是linux下C 开发的利器 出色的语法高亮 支持cmake工程让同类IDE望尘莫及 但是我在实际开发中遇到了标准库 STL 相关的语法高亮不能正常运行的问题 问题情境 我们用UBUNTU
  • PyQt QTextEdit 详细用法示例 Python

    PyQt QTextEdit 详细用法示例 Python QTextEdit 是 PyQt 中用于显示和编辑文本的小部件之一 它提供了丰富的功能 包括文本格式化 文本样式 撤销和重做操作等 在本文中 我们将探讨 QTextEdit 的详细用
  • unity could not produce class with id 210 --- TerrainInstance 其实是 UnityEngine.CoreModule.Sorting

    Strip Engine Code 幾重 張 巡 罠 https qiita com warapuri items e2562e9535bfae5013d0 More than 1 year has passed since last up
  • 在windows下详解:大端对齐和小端对齐

    计算机的内存最小单位是什么 是BYTE 是字节 一个大于BYTE的数据类型在内存中存放的时候要有先后顺序 高内存地址放整数的高位 低内存地址放整数的低位 这种方式叫倒着放 术语叫小端对齐 电脑X86和手机ARM都是小端对齐的 高内存地址放整
  • IP地址、子网掩码、网络地址、广播地址、IP网段

    文章目录 IP地址 IP地址分类 子网掩码 网络地址 广播地址 IP网段 本文主要讨论iPv4地址 IP地址 实际的 IP 地址是一串32 比特的数字 按照 8 比特 1 字节 为一组分成 4 组 分别用十进制表示然后再用圆点隔开 这就是我
  • 关于CMAKE 报错CMAKE_CUDA_ARCHITECTURES的问题

    背景 新版本cmake 增加了CMAKE CUDA ARCHITECTURES检测 某些手动安装cuda的同学会遇到该报错问题 该问题不影响代码 只是cmake内部的编译设置 cmake 3 23版本该问题报错为 CMAKE CUDA AR
  • java渗透测试基础之——RMI

    一 概述 RMI全称是Remote Method Invocation 远程方法调用 是专为Java环境设计的远程方法调用机制 远程服务器提供API 客户端根据API提供相应参数即可调用远程方法 由此可见 使用RMI时会涉及到参数传递和结果
  • 利用python建立股票量化交易系统(一)——小市值选股票模型

    从今天开始正式开启我的博客之旅 博客内容全部是我自己的量化心得 主要还是为自己将来中工作之中遇到相似问题 可以方便的找到答案 如果能帮到有相似问题的其他同学 我也很开心 如果帮不到的话 不喜勿喷 如果文章中有什么不对的地方 欢迎批评指正 建
  • 新版QQ代挂系统源码四套模板

    介绍 代挂源码 代挂对接教程源码已简洁版优化框架数据 对接代挂教程均在 压缩文件里 源码进行了优化 原后门已清楚掉 上传源码解压即可安装访问网址 网盘下载地址 https zijiewangpan com VylBgT70aLu 图片
  • 连接Charles后,小程序无法打开,提示“运行失败”解决方法

    今天在使用Charles抓包的过程中 手机端安装了证书 并且证书安装成功 使用手机浏览器可以正常抓包 但是在使用微信打开小程序准备测试时 无法打开 并且提示 运行环境失败 于是做了以下几个操作 最后可以成功抓包 1 微信版本升级 将微信卸载
  • Java代码中如何判断一个HashMap对象是否为空呢?

    转自 Java代码中如何判断一个HashMap对象是否为空呢 下文讲述检测HashMap集合对象是否无元素的方法分享 如下所示 实现思路 使用isEmpty方法即可检测HashMap中的元素是否为空 isEmpty 语法 hashmap i
  • 学习Javascript的书籍

    原文地址 http www ruanyifeng com blog 2008 01 javascript book recommendation html 作者 阮一峰 日期 2008年1月 9日 昨天 ppip同学留言 你的js主要是用什
  • SQL Server(2019)数据库----数据查询(数据库系统概论第五版)

    目录 一 课本例题查询 1 查询全体学生的姓名及其出生年份 2 查询全体学生的姓名 出生年份和所在的院系 要求用小写字母表示系名 3 查询选修了课程的学生学号 4 查询不是数学系 计算机系学生的姓名和性别 5 查询选修了3号课程的学生的学号
  • Redis面试题(四)

    文章目录 前言 一 锁互斥机制 二 watch dog 自动延期机制 三 可重入加锁机制 四 释放锁机制 五 上述 Redis 分布式锁的缺点 六 使用过 Redis 分布式锁么 它是怎么实现的 总结 前言 锁互斥机制 watch dog
  • QT中信号与槽的连接

    本文章主要通过代码的形式讲解QT中connect函数对于信号和槽函数的连接 include mainwindow h include ui mainwindow h include
  • 搞事情之使用七牛云的注意事项

    原文地址 PJ 的 iOS 开发日常 前言 本博客最初所采用的图床就是七牛 当时因为第一次使用图床之类的服务 没有进行一个比较好的筛选 并且没有考虑过多的细节 所以直接采用了七牛 经过一段时间后 因为博客访问量上去了 超出七牛每月的免费流量
  • C++ malloc/free/new/delete详解(内存管理)

    这里写目录标题 malloc free 典型用法 内存分配 实现过程 brk和mmap 申请小于128k的内存 申请大于128k的内存 释放内存 brk和mmap的区别 new delete 典型用法 内存分配 实现过程 new delet
  • 生信入门(六)——单细胞分析(Seurat)

    生信入门 六 单细胞分析 Seurat 文章目录 生信入门 六 单细胞分析 Seurat 一 数据导入 1 数据来源 2 数据导入 二 标准预处理 1 QC和选择细胞进行进一步分析 2 规范化数据 3 识别高度可变的特征 特征选择 4 缩放
  • Win10家庭版安装Docker for windows遇坑总结

    Win10家庭版安装Docker for windows遇坑总结 安装前的简单了解 安装步骤 添加Hyper v 安装Docker for windows 其他问题 因为做毕设需要结合本组学长开发的系统 不得已开始入坑学习docker 遇到
  • 程序员面试题精选100题(44)-数值的整数次方

    程序员面试题精选100题 44 数值的整数次方 题目 实现函数double Power double base int exponent 求base的exponent次方 不需要考虑溢出 方法一 由于输入的exponent是个int型的数值