题目:Pow(x, n)
类似的还有要求自己实现pow(x,n)函数,同样用到左移。
思路如下:
1.首先记录n的正负,
2.然后用32位数组记录|n|的二进制表示方法,对应位置置1,表示最后计算平方的时候,当前位的结果要加到最终结果里面。
实际上不需要用数组存储,用按位与也可以一一取出对应的1.
3.计算32位中每位的x的乘方。并根据n的正负性给出结果。
数学表示:x^13 = x^8 * x^4 * x^1;
第二步即是求8、4、1,第三步求最后的乘积。
注意:
1.首先,特殊情况要单独考虑:x = 0.0;n=0。
2.由于n需要变成正数,所以要考虑n=-2147483648不能直接加负号转成正数的特殊情况。
3.最后要把n的符号加进去
1 /************************************ 2 Implement pow(x, n). 3 ************************************/ 4 #include<stdio.h> 5 6 double myPow(double x, int n) { 7 if(x == 0.0)return x; 8 if(n == 0)return 1.0; 9 //flag标记n的正负性,end表示indexs中最高位的1的下标 10 int i,flag = 0,end = -1; 11 int val = n; 12 int indexs[32] = {0};//标记n的二进制表示法 13 if(n == -2147483648){ 14 indexs[31] = 1; 15 end = 31; 16 flag = 1; 17 } 18 else{ 19 if(n < 0){ 20 flag = 1; 21 val = -val; 22 } 23 for(i = 30;i >= 0;i--){ 24 int temp = 1; 25 temp = temp << i; 26 if(val >= temp){ 27 val -= temp; 28 indexs[i] = 1; 29 if(end == -1)end = i;//end记录最高位 30 } 31 } 32 } 33 double result = 1.0; 34 double temps[32] = {0.0}; 35 temps[0] = x; 36 if(indexs[0] == 1)result = result*temps[0]; 37 for(i = 1;i <= end;i++){ 38 temps[i] = temps[i - 1]*temps[i - 1];//求x^2^i 39 if(indexs[i] == 1)result = result*temps[i]; 40 } 41 if(flag == 1) return 1.0/result; 42 return result; 43 } 44 45 void main(){ 46 printf("%lf ",myPow(1.0000000001,-2147483648)); 47 }