50. Pow(x, n)
Implement pow(x, n).
class Solution {
public:
double myPow(double x, int n) {
}
};
解题思路:
-
自己的解题思路
给了一个大致精确地算法,对于|x|<1e-7,默认为0;然后,考虑特殊的myPow(0.0, 0);
之后,用分治法进行迭代就可以获得结果。
-
别人的解题思路
查看了<math.h>关于pow()的算法。发现官方文档给的算法很巧妙
先将n取正,然后将n换成2进制数,每位都有一个权重。
如果n->(nk
… n
2 n1),则x^n=x^(nk
… n
2 n1)=x^(nk权重)*
…x^(n
2权重) *x^(n1权重)
边界条件:
Boundary Conditions:
if(x==0 && n==0) result=1;
if((n<=INT_MIN || n>=INT_MAX) && (x>1 || x<-1)) result=0;
if(x==1 && n==INT_MIN) result=1;
if(n>=INT_MAX && (x==1 || x==-1)) result=x;
if(n<=INT_MIN && (x==1 || x==-1)) result=-x;
学习收获:
-
加深对类型转换的理解。
首先, int a=INT_MIN; 则
int b =-a; //b仍然为INT_MIN
unsiged c=-a; //c为INT_MAX+1
long d=-a; //d=
0xffffffff80000000 ;
也就是仍未
INT_MIN
对于
long long
也是如此;
unsiged long e=-a; //e=0x80000000;
也就是
INT_MAX+1
;
unsiged long long f=-a; //f=0xffffffff80000000;
也就是
18446744071562067968
;
因此可以得出结论,
-a
先在
int
类型下面转为(
-
运算)为
int;
然后再对
int
进行转化位数扩展,如果它是负数,那么进行位数扩展的时候,增加
1
而不是
0
,(
不管赋值给有符号数还是无符号数
);之后,再进行转换。
-
近距离接触一次优质代码,牛人写的代码真是简练。
需要继续学习这种位运算的算法。
-
知道如何关闭word文档的首字母自动大写功能;
点文件->选项->校对->自动更正选项->取消“句首字母大写”前面钩钩即可。
附件:程序
1、自己的程序:
double
myPow
(
double
x
,
int
n
)
{
if
(
abs
(
x
)
<
1e-7
)
{
if
(
n
)
{
return
0.0
;
}
else
{
return
1.0
;
}
}
int
m
=
(
n
>
0
)
?
n
:
-
n
;
double
res
=
power
(
x
,
m
);
return
(
n
>
0
)
?
res
:
1.0
/
res
;
}
double
power
(
double
x
,
int
n
)
{
if
(
n
==
0
)
{
return
1.0
;
}
else
if
(
n
%
2
)
{
double
tem
=
power
(
x
,
n
/
2
);
return
tem
*
tem
*
x
;
}
else
{
double
tem
=
power
(
x
,
n
/
2
);
return
tem
*
tem
;
}
}
2、别人的程序
这是一个官方程序,没有bug。很好地考虑好边界问题。
double
myPow
(
double
x
,
int
n
)
{
unsigned
int
m
=
(
n
>
0
)?
n
:-
n
;
for
(
double
res
=
double
(
1
);;
x
*=
x
)
{
if
((
m
&
1
)
!=
0
)
{
res
*=
x
;
}
if
((
m
>>=
1
)
==
0
)
{
return
(
n
<
0
?
double
(
1
)
/
res
:
res
);
}
}
}