剑指Offer - 面试题16:数值的整数次方

简介: 剑指Offer - 面试题16:数值的整数次方

题目

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


分析

暴力法

exponet次方,循环exponet次就可以了。时间复杂度为O(n),O(1);

C

#include<stdio.h>
#include<stdlib.h>
//暴力法
double Power(double base, int exponent)
{
  int i = 0;
  double sum = 1;
  for (i = 0; i < exponent; i++)
  {
    sum *= base;
  }
  return sum;
}
int main()
{
  printf("2^3=%f\n", Power(2, 3));
  return 0;
}


递归法

我们可以得出公式:baseexponet = base exponet-1;复杂度不变,但是写法比较优雅。

C

#include<stdio.h>
#include<stdlib.h>
//递归
double Power(double base, int exponent)
{
  if (exponent == 0)
  {
    return 1;
  }
  return Power(base, exponent - 1) * base;
}
int main()
{
  printf("2^3=%f\n", Power(2, 3));
  return 0;
}


但是上面俩种方法都存在一种隐藏危险,如果输出负数怎么办???

所以我们要把所有情况都考虑进来比如,base=0,exponent为负数,小数,零等。

优化的暴力法

C

#include<stdio.h>
#include<stdlib.h>
double Power(double base, double exponent)
{
  if (base == 0 || exponent < 0)//exponent < 0
  {
    return -1;
  }
  int flag = 1;//记录exponent正负,1表示大于1,-1表示在0-1直接
  int i = 0;
  double sum = 1;
  if (exponent < 1 && exponent > 0)//0 <  exponent < 1
  {
    exponent = 1.0 / exponent;
    flag = -1;
  }
  for (i = 0; i < exponent; i++)
  {
    sum *= base;
  }
  if (flag == -1)//如果exponent本身是小数就求倒数
  {
    sum = 1.0 / sum;
  }
  return sum;
}
int main()
{
  printf("2^3=%f\n", Power(2, 3));
  return 0;
}


公式+递归

如果求216,可以转换为求28 * 28;28 = 24*24;24 = 22 * 22;22 = 21 * 21;

同理求215,215 = 27*28;28又等价于上面得到计算,这里我们只算27;27=24*23;23=21*22;

我们还可以优化215。215 = 2 * 2 7 * 27;把那个奇数单独拿出来。

根据上面的规律我们可以列一个公式


我们根据公式实现递归算法。

时间复杂度为O(log2n),空间复杂度为O(1);

C

#include<stdio.h>
#include<stdlib.h>
//这里的exponent是整数哦
double PowerRecursion(double base, int exponent)//递归计算  
{
  if (exponent == 0)
  {
    return 1;
  }
  if (exponent == 1)
  {
    return base;
  }
  double sum = PowerRecursion(base, exponent >> 1);
  sum *= sum;
  if (exponent % 2 == 1)//只要是奇数,就在单独乘一次。
  {
    sum *= base;
  }
  return sum;
}
double Power(double base, double exponent)
{
  if (base == 0 || exponent < 0)//exponent < 0
  {
    return -1;
  }
  int flag = 1;//记录exponent正负,1表示大于1,-1表示在0-1直接
  int i = 0;
  double sum = 1;
  if (exponent < 1 && exponent > 0)//0 <  exponent < 1
  {
    exponent = 1.0 / exponent;
    flag = -1;
  }
  sum = PowerRecursion(base, (int)exponent);
  if (flag == -1)//如果exponent本身是小数就求倒数
  {
    sum = 1.0 / sum;
  }
  return sum;
}
int main()
{
  printf("2^3=%f\n", Power(2, 3));
  return 0;
}

本章完!


目录
相关文章
|
Python
LeetCode 面试题 16.07. 最大数值
编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。
68 0
|
30天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
62 1
|
2月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
252 0
2024年Java秋招面试必看的 | MySQL调优面试题
|
2月前
|
存储 算法 Java
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
47 1
|
2月前
|
NoSQL Java 关系型数据库
凭借Java开发进阶面试秘籍(核心版)逆流而上
最近参加了面试或者身边有朋友在面试的兄弟有没有发现,现在的面试不仅会问八股文,还会考察框架、项目实战、算法数据结构等等,需要准备的越来越多。 其实面试的时候,并不是要求你所有的知识点都会,而是关键的问题答到点子上!这份《Java 开发进阶面试秘籍(核心版)》由 P8 面试官整体把控,目前已经更新了 30 万字! 资料中涵盖了一线大厂、中小厂面试真题,毕竟真题都是技术领域最经典的基础知识和经验沉淀的汇总,非常有必要学习掌握!双重 buff 叠加,offer 接到手软~ 点击此处取,这可能是你到目前为止领取的最具含金量的一份资料! 整套资料涵盖:Spring、Spring
|
2月前
|
存储 缓存 Java
面试官:什么是Java内存模型?
面试官:什么是Java内存模型?
112 0
面试官:什么是Java内存模型?
|
1月前
|
消息中间件 NoSQL 网络协议
Java面试知识点复习​_kaic
Java面试知识点复习​_kaic
|
4天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
32 1
|
4天前
|
设计模式 搜索推荐 Java
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
12 0
|
20天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0