【校招面试 之 剑指offer】第16题 数值的整数次方

方法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的情况。 

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #b4261a }

    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;
}

  

原文地址:https://www.cnblogs.com/xuelisheng/p/9364478.html

时间: 2024-07-30 09:19:49

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

【剑指offer】16、数值的整数次方

题目 实现double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同样需要考虑大数问题. 思路 题目意思很清楚,需要考虑情况周全. 1.若base=0,exp <= 0 2.若exp >= 0 , 直接return计算后的数值 若exp <= 0 ,return 计算后数值的倒数 注意定义是double,因此写代码时要写成0.0,1.0 class Solution { public: double Power(d

《剑指Offer》题目:数值的整数次方

题目描述:数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目分析:题目的关键在于要考虑exponent为负数的情况. Java代码: public class Power { public static double power(double base, int exponent) { double res = 1.0; if(exponent == 0){ return 1.0; } if(exponent > 0

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

一.题目 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.思路 1.传统方法计算,时间复杂度O(n) 2.递归方式计算,时间复杂度O(logn) 当exponent为偶数时,例如求base^10,则result= base^5  *  base^5: 当exponent为奇数数时,例如求base^11,则result= base^5 *  base^5 * base: 接着采用递归的方法,计算base^5 即可. 三.代码 1.

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

题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 思路分析 要考虑到指数为负数的情况,而且指数为负数的时 base不能为0,因为指数为负数时,是指数的绝对值次幂的倒数,(分母不能为0),考虑到这些情况之后,就可以转化为求exponent的绝对值 次幂的问题,即指数为正数的情况 现在考虑如何求数值的整数次幂(指数为正数的情

【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列

#include<iostream> #include<stack> using namespace std; template <typename T> void pushQueue(stack<T> &stack1, T t){ stack1.push(t); } template<typename T> T popQueue(stack<T> &stack1, stack<T> &stack2

【校招面试 之 剑指offer】第9-2题 用两个队列实现一个栈

#include<iostream> #include<queue> using namespace std; // 对于出栈解决的思路是:将queue1的元素除了最后一个外全部放到queue2中,然后再pop出queue1的最后一个元素... template<typename T> void popStack(queue<T> &queue1, queue<T> &queue2){ if(queue1.size() == 0)

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

题目:我们可以使用2??1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2??1的小矩形无重叠地覆盖一个2??8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着放,记总的情况为f(8).如果是竖着放,则记下来还有f(7)种放法:若是横着放,则下一块必须横着放,则还有f(6)种放法. 所以可以推导出公式:f(1) = 1 f(2) = 2 f(n)(n为偶数) = f(n-1)+f(n-2); #include<iostream> #include<

&lt;剑指offer&gt; 第16题

题目: 输入一个函数,输入一个二叉树,该函数输出它的镜像 代码: public class Sixteenth { public static class BinaryTreeNode{ BinaryTreeNode leftChild; BinaryTreeNode rightChild; int val; } public static void getMirrorBinaryTree(BinaryTreeNode node){ if(node != null){ BinaryTreeNod

剑指Offer--第16题 数值的整数次方

第16题 数值的整数次方 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 看到有点懵,第一感觉觉得是不是应该考虑0的0次或者负数情况,还有就是浮点类型没办法使用"="号,最后自己以偷懒的方式直接调用Java的API,如果面试题中不让调用库函数,那么基本上这题就是挂了可能. 以上题目描述来自牛客,没有对使用做限制.真正的剑指offer上有限制条件不得使用库函数,同时不需要考虑大数问题. 自己的low代码 publ