方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况。

#include<iostream>
using namespace std; template<typename T>
T myPow(T a, int m){
double base = 1;
int flag = (m < 0) ? -1 : 1;
int n = (m < 0) ? -m : m; while(n > 0){
base = base * a;
n --;
}
if(flag == -1){
if(a != 0){
return (1/base);
}
cout<<"当指数为负时,0不能作为底数!"<<endl;
exit(-1);
}
return base;
}
int main(){ double a = 0;
// int a = 2;
int n = 10;
cout<<"求"<<a<<"的"<<n<<"次方为:"<<myPow(a, n)<<endl;
system("pause");
return 0;
}

方法2:可以归纳出下面的公式进行求解,使得循环次数大幅减小。也要注意特殊情况的处理:即当指数为负,且底数为0的情况。 

    an/2*an/2    n为偶数

a=

     a(n-1)/2*a(n-1)/2*a    n为奇数

#include<iostream>
using namespace std; // 符号处理(符号处理放在递归方法中出现问题,所以拿了出来)
template<typename T>
double myPow1(T a, int m){
int flag = (m < 0) ? -1 : 1;
int n = (m < 0) ? -m : m;
double result = myPow2(a, n, flag);
cout<<result<<endl;
if(flag == -1){
if(a != 0){
return (1/result);
}
cout<<"当指数为负时,0不能作为底数!"<<endl;
exit(-1);
}
return result;
}
template<typename T>
T myPow2(T a, int n, int flag){
double result; if(n == 0){
return 0;
}
if(n == 1){
return a;
}
if(n%2 == 0){
result = myPow2(a, n/2, flag) * myPow2(a, n/2, flag);
}else{
result = myPow2(a, (n-1)/2, flag) * myPow2(a, (n-1)/2, flag) * myPow2(a, 1, flag);
}
return result;
} int main(){ double a = 0;
// int a = 2;
// int n = 8;
int n = -10;
cout<<"求"<<a<<"的"<<n<<"次方为:"<<myPow1(a, n)<<endl;
system("pause");
return 0;
}

  

【校招面试 之 剑指offer】第16题 数值的整数次方的更多相关文章

  1. 剑指Offer - 九度1514 - 数值的整数次方

    剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...

  2. 剑指Offer:面试题11——数值的整数次方(java实现)

    题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...

  3. 剑指offer(12)数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目分析 这道题用传统的方法也可以做,只不过效率太低,这里我们用到快速幂的方法 ...

  4. 剑指offer十二之数值的整数次方

    一.题目 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.思路 1.传统方法计算,时间复杂度O(n) 2.递归方式计算,时间复杂度O ...

  5. 【剑指Offer】12、数值的整数次方

      题目描述:   给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   解题思路:   本题看似比较简单,是一个简单的指数运算,但需要完 ...

  6. 【Offer】[16] 【数值的整数次方】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数 ...

  7. 【校招面试 之 剑指offer】第18题 删除链表中的节点

    题目一:在O(1)时间内删除链表节点. 给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点. 思路:(1)如果要删除的节点不是链表的尾节点,则将被删除节点的内容复制到该节点,然 ...

  8. 【校招面试 之 剑指offer】第11题 旋转数组中的最小数字

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  9. 【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题

    题目:我们可以使用2✖️1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2✖️1的小矩形无重叠地覆盖一个2✖️8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着 ...

随机推荐

  1. centos 装iptraf查看网络流量

    今天在测试服务器上准备看下网络流量 [root@localhost ~]# iptraf -d eth0-bash: iptraf: command not found 发现运维同事没有给安装 只能自 ...

  2. Tornado 框架的使用

    Tornado tornado是一个轻量级python的web框架,他是非阻塞式的,而且速度非常快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着 ...

  3. 第15章 高并发服务器编程(2)_I/O多路复用

    3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过“拨开关”方式,来同时处理多 ...

  4. C++多线程同步之Semaphore(信号量)

    一.线程间同步的几种方式 从上篇博文中可以发现,当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术.线程间的同步有多种方式,在接下来的博文中我 ...

  5. 通过yum升级gcc/g++至版本4.8.2

    最近在坐一个日期处理的问题,需要安装sxtwl模块,但是gcc版本4.7死活也安装不上,最后测试到只能升级gcc版本到4.8才得以解决 [root@123 bin]# gcc -vUsing buil ...

  6. Visual Studio自动添加头部注释

    VS2013 自动添加头部注释 1.找到VS2013的安装目录 下文以安装目录 C:\Program Files (x86)\Microsoft Visual Studio 12.0 为例 2.修改C ...

  7. 分水岭算法(理论+opencv实现)

    分水岭算法理论 从意思上就知道通过用水来进行分类,学术上说什么基于拓扑结构的形态学...其实就是根据把图像比作一副地貌,然后通过最低点和最高点去分类! 原始的分水岭: 就是上面说的方式,接下来用一幅图 ...

  8. 《GPU高性能编程CUDA实战》第八章 图形互操作性

    ▶ OpenGL与DirectX,等待填坑. ● basic_interop #include <stdio.h> #include "cuda_runtime.h" ...

  9. Python 中一个逗号引发的悲剧

    遇到一个 Python 字符串的坑,记录一下.看看下面这些代码 >>> a = [ ... 'foo' ... 'bar', ... 'tree' ... ] >>> ...

  10. net 编译报错:编辑器或项目正在尝试签出在内存中修改的文件,这将导致保存该文件

    1,报错提示: 编辑器或项目正在尝试签出在内存中修改的文件,这将导致保存该文件. 在生成过程中保存文件是危险的,这可能会在将来导致不正确的生成输出. 是否仍然继续签出? 2,原因:licenses.l ...