2的整数次幂请问怎么算呀? 请大家指教一下,先谢谢了。。。。。。。
0001 = 2^0
0010 = 2^1
0100 = 2^2
1000 = 2^3
...
所以计次幂就是把1左移几位。
区分结果精度要求,以及数据规模,有如下两种情况:
1 当数据规模被限定,非负整数,且结果要求准确值时,可以用整型进行计算。
(1) 依照数学定义进行计算。
int pow_2(int i)
{
int r = 1;
while(i --) r*=2;//将2自乘i次,得到2的i次方。
return r;
}
(2) 由于2的特殊性,可以转为移位方式,计算结果。
int pow_2(int i)
{
return 1<<i;//将一个数左移一位,在没有溢出的情况下,等效于乘2。于是2的i次方就是1<<i。该方法更高效。
}
2 当数据规模偏大,整型会溢出时,需要用浮点型存储。如果i为负数,或浮点型数,那么同样需要浮点型存储。这时需要使用数学函数pow。
double pow(double x, double y);
声明与math.h, 功能为求x的y次方。
于是2的y次方可以写作
pow(2,i);
这个可以用递归,用递归效果非常好,
我们一般求解m的n次方,一般使用n个m相乘的办法来求解。其实我们还可以使用另外一种更有效率的办法求解这个问题。我们知道一个数的0次方等于1,一个数的1次方等于该数本身。如果一个数的n次方的n可以被2整数,我们可以将求解的问题,分解为m的(n/2)次方乘以m的(n/2)次方。如果不能被2整除,则可以将问题求解转变为m乘以m的(n-1)次方,通过这个递归的办法,我们可以很快的分解求出问题。编写代码如下:
#include
unsigned long myPow(int m, int n)
{
unsigned long tmp;
if(n == 0)
return 1;
if(n == 1)
return m;
if(n % 2 == 0){
tmp = myPow(m, n/2);
return tmp*tmp;
}
else{
return m*myPow(m, n-1);
}
}
int main(int argc, char *argv[])
{
int m,n;
printf("please input the bottom number.\n");
scanf("%d", &m);
printf("please input the exponent number.\n");
scanf("%d", &n);
printf("the result of power(%d,%d) is %ld\n", m, n, myPow(m, n));
return 0;
}
在long long范围内可以直接位运算,就是
x=1<<n //n为几次方
所以求2的幂时就是用位运算,简单而且快速具体原理就是上面那个0001,0010,0100,1000的描述