剑指offer系列10---数值的整数次方

【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

* 【思路】主要是考虑幂的正负数以及等于0三种情况。但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常。

下面给出版本一:

 1 package com.exe3.offer;
 2
 3 /**
 4  * 【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 5  * 【思路】主要是考虑幂的正负数以及等于0三种情况。但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常。
 6  * @author WGS
 7  *
 8  */
 9 public class Power {
10     public double getPower(double base,int exponent){
11         double result=1;
12         if(exponent==0)
13             return 1.0;
14         if(exponent>0){
15             for(int i=0;i<exponent;i++){
16                 result *=base;
17             }
18         }else{
19             double absExponent=-exponent;
20             for(int i=0;i<absExponent;i++){
21                 result *=base;
22             }
23             result=1.0/result;
24         }
25         return result;
26
27     }
28     public static void main(String[] args){
29         Power power=new Power();
30         double result=power.getPower(0, -2);
31         System.out.println(result);
32     }
33 }
将题中重复代码放至一个方法中:

 1 package com.exe3.offer;
 2
 3 /**
 4  * 【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 5  * 【思路】主要是考虑幂的正负数以及等于0三种情况。但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常。
 6  * @author WGS
 7  *
 8  */
 9 public class Power {
10     public double getPower(double base,int exponent){
11         double result=1;
12         if(exponent==0)
13             return 1.0;
14         if(exponent>0){
15             result=powerWithExponent(base,exponent);
16         }else{
17             double absExponent=-exponent;
18             result=powerWithExponent(base,absExponent);
19             result=1.0/result;
20         }
21         return result;
22
23     }
24     public double powerWithExponent(double base,double exponent){
25         double result=1;
26         for(int i=0;i<exponent;i++){
27             result *=base;
28         }
29         return result;
30     }
31     public static void main(String[] args){
32         Power power=new Power();
33         double result=power.getPower(0, -2);
34         System.out.println(result);
35     }
36 }

经测试可达到效果。但实际上此版本中有很多考虑不周的地方,第一,在判断exponent是否等于0时不能直接用==,计算机内部表示小数时有误差;第二,求幂运算时还有更优代码:

 1 package com.exe3.offer;
 2
 3 public class Power2 {
 4     public double getPower(double base,int exponent){
 5         double result=1;
 6         //处理异常底数是0且指数是负数的情况
 7         if(equal(base,0.0)&&exponent<0){
 8             return 0.0;
 9         }
10         if(exponent>0){
11             result=powerWithExponent(base,exponent);
12         }else{
13             double absExponent=-exponent;
14             result=powerWithExponent(base,absExponent);
15             result=1.0/result;
16         }
17         return result;
18     }
19
20     public double powerWithExponent(double base,double exponent){
21         double result=1;
22         for(int i=0;i<exponent;i++){
23             result *=base;
24         }
25         return result;
26     }
27     public boolean equal(double base,double d){
28         if((base-d<0.0000001)&&(base-d>0.0000001)){
29             return true;//相等
30         }else{
31             return false;
32         }
33     }
34     public static void main(String[] args){
35         Power2 p2=new Power2();
36         double result=p2.getPower(0, -2);
37         System.out.println(result);
38     }
39 }

实际上,此处的powerWithExponent(double base,double exponent)还有更优的方法,由于没有完全明白,在此就不叙述了。

时间: 2024-10-07 20:11:08

剑指offer系列10---数值的整数次方的相关文章

剑指offer系列——12.数值的整数次方

Q:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. C:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M T: 1.刚刚学习了快速幂,正好用上:https://www.cnblogs.com/xym4869/p/12240806.html 这个题要注意,exponent可能为负. A: double Power(double base, int expo

[剑指offer]Q11:数值的整数次方

pow(base, exponent) 考虑一下几种情况: base = 0, 那么直接返回0 base = 1, 那么直接返回1 exponent = 0, 那么直接返回1, 注意base= 0 exponent = 1, 那么直接返回 base exponent  为正为负 的情况 主要考察的点是将问题缩减,用折半的思想.这个题细节还是很多的,为了便于验证,leetcode上恰好有这个题,建议在线AC一下. def equal(self, a, b): return abs(a - b) <

剑指offer 13:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 问题分析 计算一个浮点数的整数次方,主要考察的是对输入数据的完整性的预估能力.针对此问题,输入数据可能存在以下情况: 1.底数不为0,指数都为整数 2.底数不为0,指数都为负数 3.底数为0,指数为负数(出现零除情况) 4.底数为0,指数为正数(给定特殊值0或1) 代码实现的逻辑并不复杂,主要是需要考虑到所有可能存在的输入情况,同时需

剑指offer 12:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double Power(double base, int exponent) { boolean isNegtive = false; if(exponent == 0) return 1; if(exponent == 1) return base; if(exponent < 0){ isNegtive =

【剑指offer】15_数值的整数次方

题目 给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方 保证base和exponent不同时为0. 1.用内置函数pow 语法: class Solution: def Power(self, base, exponent): # write code here if base == 0: return 0 elif exponent == 0: return 1 elif base == 1: return 1 elif expone

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer系列——10.矩阵覆盖

Q:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M T:@flysall 第一种情况等价于情形1中阴影部分的n-1块矩形有多少种覆盖方法,为f(n-1); 第二种情况等价于情形2中阴影部分的n-2块矩形有多少种覆盖方法,为f(n-2); 故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列.... A: int r

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer(1~10)题解

剑指offer(1~10) 二维数组中的查找 源代码 class Solution { public: bool Find(int target, vector<vector<int> > array) { for(int i = 0 ; i < array.size() ; i ++){ for( int j = array[i].size() - 1 ; j >= 0 ; j--){ if( array[i][j] == target){ return true;