剑指offer——数值的整数次方

目录

  • 1. 题目描述
  • 2. 一般思路
    • 2.1 有问题的思路
    • 2.2 全面但不高效的思路
    • 2.3 面试小提示
  • 3. 全面又高效的思路

1. 题目描述

  • 题目:实现函数 double Power(double base,int exponent),求base 的exponent 次方。不得使用库函数,同时不需要考虑大数问题

2. 一般思路

2.1 有问题的思路

  • 由于不需要考虑大数问题,这道题看起来很简单,可能不少应聘者在看到题目30秒后就能写出如下的代码:
#include <stdio.h>float Power(double base, int exponent)
{double result = 1.0;for (int i = 0; i < exponent; i++){result *= base;}return result;
}int main()
{double base = 0;int exponent = 0;scanf("%lf %d", &base, &exponent);printf("%lf", Power(base, exponent));return 0;
}
  • 运行结果为:

在这里插入图片描述

  • 不过遗憾的是,写得快不一定就能得到面试官的青睐,
  • 因为面试官会问要是输入的指数(exponent)小于1
  • 即是零和负数的时候怎么办?上面的代码完全没有考虑,只包括了指数是正数的情况。

2.2 全面但不高效的思路

  • 我们知道当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。
  • 既然有求倒数,我们很自然就要想到有没有可能对0求倒数,如果对0求倒数怎么办?
  • 当底数(base)是零且指数是负数的时候,如果不做特殊处理,就会出现对0求倒数从而导致程序运行出错。怎么告诉函数的调用者出现了这种错误?
  • 前面提到我们可以采用3种方法返回值、全局代码和异常。
  • 面试的时候可以向面试官阐述每种方法的优缺点,然后一起讨论决定选用哪种方式。
  • 最后需要指出的是,由于0的0次方在数学上是没有意义的,因此无论是输出0还是1都是可以接受的,
  • 但这都需要和面试官说清楚,表明我们已经考虑到这个边界值了。
  • 有了这些相对而言已经全面很多的考虑,我们就可以把最初的代码修改如下:
#define wucha 0.00000001
#include <stdio.h>
#include <math.h>float Power(double base, int exponent)
{if (abs(base) < wucha){return 0.0;}//底数为0,(底数指数都为0则结果默认为0)if (exponent == 0){return 1.0;}//指数为0double result = 1.0;if (exponent > 0){for (int i = 0; i < exponent; i++){result *= base;}return result;}//指数为正else if (exponent < 0){for (int i = 0; i > exponent; i--){result *= base;}return 1 / result;}//指数为负
}int main()
{double base = 0;int exponent = 0;while (scanf("%lf %d", &base, &exponent) != EOF){printf("%lf\n", Power(base, exponent));}return 0;
}
  • 运行结果为:

在这里插入图片描述

  • 一个细节值得我们注意:在判断底数base是不是等于0时,不能直接写base=-0,
  • 这是因为在计算机内表示小数时(包括 foat和 double 型小数)都有误差。判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围内。
  • 如果两个数相差很小,就可以认为它们相等。

2.3 面试小提示

  • 由于计算机表示小数(包括 foat和 double 型小数)都有误差,我们不能直接用等号(==)判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于 0.0000001,就可以认为它们相等。

3. 全面又高效的思路

  • 此时我们考虑得已经很周详了,已经能够达到很多面试官的要求了。
  • 但是如果我们碰到的面试官是一个在效率上追求完美的人,那么他有可能会提醒我们函数 Power还有更快的办法。
  • 如果输入的指数 exponent为32,我们在函数 Power的循环中需要做 31次乘法。
  • 但我们可以换一种思路考虑:我们的目标是求出一个数字的 32次方,如果我们已经知道了它的16次方,那么只要在 16 次方的基础上再平方一次就可以了。而16次方是8次方的平方。
  • 这样以此类推,我们求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。
  • 也就是说,我们可以用如下公式求a的n次方:

在这里插入图片描述

  • 代码如下:
#include <stdio.h>float Power2(double base, unsigned int exponent)
{if (exponent == 0){return 1;}if (exponent == 1){return base;}double result = Power2(base, exponent >> 1);result *= result;if (exponent & 1 == 1){result *= result;}return result;
}int main()
{double base = 0;unsigned int exponent = 0;while (scanf("%lf %d", &base, &exponent) != EOF){printf("%lf\n", Power2(base, exponent));}return 0;
}
  • 但是美中不足的是这个代码只能求非负数的非负数幂

在这里插入图片描述

最后,
恭喜你又遥遥领先了别人!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…

AIGC盛行,带你轻松调用开发

文章目录 前言一、&#x1f4d6;AIGC简介二、&#x1f4e3;开通体验开通模型获取API-KEY 三、&#x1f4dd;基于java实现调用1.设置API-KEY2.体验大语言模型多轮对话演示补充流式输出 3.体验通义千问VL使用官方提供照片本地文件多轮对话流式输出 总结 前言 本篇文章基于java和…

C++的进阶泛型编程学习(1):函数模板的基本概念和机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板1.1 模板的概念1.1.1 形象的解释&#xff1a;模板就是通用的模具&#xff0c;目的是提高通用性1.1.1 模板的特点&#xff1a;1.1.2 综述模板的作用 1.2…

揭秘Angular世界的奥秘:全面提升你的前端开发技能!

介绍&#xff1a;Angular是一个由Google维护的开源JavaScript框架&#xff0c;专为构建Web应用程序而设计&#xff0c;特别适合开发大型单页应用&#xff08;SPA&#xff09;。以下是对Angular的详细介绍&#xff1a; 技术栈&#xff1a;Angular使用HTML作为模板语言&#xff0…

耳机壳UV树脂制作私模定制耳塞需要注意什么问题?

制作私模定制耳塞需要注意以下问题&#xff1a; 耳模制作&#xff1a;获取准确的耳模是制作私模定制耳塞的关键步骤。需要使用合适的材料和方法&#xff0c;确保耳模的准确性和稳定性。材料选择&#xff1a;选择合适的UV树脂和其它相关材料&#xff0c;确保它们的质量和性能符…

2024.2.15每日一题

LeetCode 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&am…

SpringCloud-Hystrix:服务熔断与服务降级

8. Hystrix&#xff1a;服务熔断 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免失败&#xff01; 8.1 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服…

深度学习疆界:探索基本原理与算法,揭秘应用力量,展望未来发展与智能交互的新纪元

目录 什么是深度学习 深度学习的基本原理和算法 深度学习的应用实例 深度学习的挑战和未来发展方向 挑战 未来发展方向 深度学习与机器学习的关系 深度学习与人类的智能交互 什么是深度学习 深度学习是一种基于神经网络的机器学习方法&#xff0c;旨在模仿人类大脑分析…

2024.02.14作业

1. 请编程实现二维数组的杨辉三角 #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {int n;scanf("%d", &n);int a[n][n];memset(a, 0, sizeof(a));a[0][0] 1;for (int i 1; i < n; i){for (int j 0; j < i …

云原生之容器编排-Docker Swarm

1. 前言 上一篇我们讲到Docker Compose可以定义和运行多容器应用程序&#xff0c;用一个YAML配置文件来声明式管理服务&#xff0c;在一台安装了Docker engine的Linux系统上可以很好的工作&#xff0c;但是现实中不可能只有一台Linux系统&#xff0c;一台Linux系统不可能有足够…

单片机学习笔记---LCD1602功能函数代码

目录 LCD1602.c 模拟写指令的时序 模拟写数据的时序 初始化 显示字符 显示字符串 显示数字 显示有符号的数字 显示16进制数字 显示二进制数 LCD1602.h main.c 上一篇讲了LCD1602的工作原理&#xff0c;这一节开始代码演示&#xff01; 新创建工程&#xff1a;LCD1…

黑马程序员——移动Web——day02

目录 空间转换 空间转换简介平移视距旋转左手法则rotate3d-了解立体呈现案例-3d导航缩放动画 动画实现步骤animation复合属性animation拆分写法案例-走马灯精灵动画多组动画综合案例-全名出游 背景云彩位置和动画文字动画 1.空间转换 空间转换简介 空间&#xff1a;是从坐标…

AcWing 112. 雷达设备(区间贪心)

[题目概述] 假设海岸是一条无限长的直线&#xff0c;陆地位于海岸的一侧&#xff0c;海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上&#xff0c;且雷达的监测范围为 d&#xff0c;当小岛与某雷达的距离不超过 d 时&#xff0c;该小岛可以被雷…

[Angular 基础] - 自定义事件 自定义属性

[Angular 基础] - 自定义事件 & 自定义属性 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上是能够实现渲染静态页面的基础 之前的内容主要学习了怎么通过…

第13章 网络 Page727~728 asio定时器例子:后创建的定时器先产生到点事件

代码&#xff1a; 35行&#xff0c;42行&#xff0c;51行&#xff0c;分别构造三个对象&#xff0c; 36行&#xff0c;43行&#xff0c;52行&#xff0c;设置了三个任务peng1、peng2、peng3&#xff0c;并将任务交给io_service对象&#xff08;不需要ios的run()方法启动起来&a…

如何创建和填写 PDF 表单,简化您的文档工作流

阅读本文&#xff0c;了解如何在开源办公套件 ONLYOFFICE 中创建和填写 PDF 表单。 ONLYOFFICE表单发展小史 ONLYOFFICE 表单首个版本发布于2022年1月18日&#xff0c;是 ONLYOFFICE 版本 7.0 更新的一部分。 您可以使用 ONLYOFFICE 表单&#xff0c;创建各种类型的模板文档&a…

Linux多线程[一]

引入知识 进程在线程内部执行是OS的系统调度单位。 内核中针对地址空间&#xff0c;有一种特殊的结构&#xff0c;VM_area_struct。这个用来控制虚拟内存中每个malloc等申请的空间&#xff0c;来区别每个malloc的是对应的堆区哪一段。OS可以做到资源的精细度划分。 对于磁盘…

Android之Android.bp文件格式语法(一百八十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

vue学习106-120

创建项目p106 router&#xff0c;store和app.vue不用删 清一下router里的路由配置 vant组件库p107 目标&#xff1a;认识第三方vue组件库vant-ui&#xff08;cv战士&#xff09; 封装好了的组件整合在一起就是组件库 http://vant-contrib.gitee.io/vant/v2/#/zh-CN/ vue2用va…

2024.02.13作业

21. c 22. b 23. b 5先出栈意味着1234都在栈内&#xff0c;此时1不能比2&#xff0c;3先出栈 24. b, c, d: 10, 12, 120 25. 2, 5 26. 数组越界&#xff0c;可能出现段错误 27. 0, 41 28. 1, 320 29. *a *b; *b *a - *b; *a - *b; 30. 0x801005&#xff1b;0x8…