利用位运算求数值的整数次方
2012-08-21 19:42
316 查看
算法比较简单,可以举例说明。
求解2^11次方,11的二进制表示为:1101, 每一位分别代表2^3, 2^2, 2^1, 2^0, 2^11, 即:8, 4 ,2 ,1.
所以2^11 = 2^(8*1+4*1+0*2+1*1) = 2^8 * 2^4 * 2^0 * 2^1
所以我们只要求出每一位所代表的数字(2^n), 以及这一位为0还是为1。
求解2^11次方,11的二进制表示为:1101, 每一位分别代表2^3, 2^2, 2^1, 2^0, 2^11, 即:8, 4 ,2 ,1.
所以2^11 = 2^(8*1+4*1+0*2+1*1) = 2^8 * 2^4 * 2^0 * 2^1
所以我们只要求出每一位所代表的数字(2^n), 以及这一位为0还是为1。
#include<iostream> using namespace std; int main() { int exponent; double base; cout<<"base = "; cin>>base; cout<<"exponent = "; cin>>exponent; double sum = 1;//记录最终的答案 double tmp = base;//防止base被改动 int mult = 1;//指示指数的符号 int fact = 1;//指示基数的符号 if(base == 0)//基数不为0 { cout<<"base should larger than Zero!"<<endl; system("pause"); return 0; } if(exponent == 0)//指数为0,幂 = 1; { cout<<"sum = 1"<<endl; system("pause"); return 0; } if(tmp<0 && exponent%2==1)//如果基数为负数,且指数为奇数,那么最后答案为负数 { fact = -1; tmp = -tmp; } if(exponent < 0)//指数小于0的话,指数取绝对值,最后答案取倒数 { mult = -1; exponent = abs(exponent); } //=====================================Main parts while(exponent)//循环右移 { if(exponent&0x01)//如果最低位是1,那么表示这一位需要计算 { sum *= tmp; } tmp *=tmp; exponent = exponent>>1; } //=============================================== if(mult == 1) cout<<"sum = "<<sum*fact<<endl; else cout<<"sum = "<<1<<"/"<<sum*fact<<endl; system("pause"); return 0; }
相关文章推荐
- 牛客网-《剑指offer》-数值的整数次方[快速幂运算]
- 数值的整数次方
- 数值的整数次方
- 剑指offer题解 数值的整数次方
- 面试题11. 数值的整数次方
- 数值整数次方
- 面试题---数值的整数次方
- 剑指Offer面试题11[数值的整数次方]
- 剑指offer-11:数值的整数次方
- 面试题11:数值的整数次方
- 数值的整数次方(不考虑结果的大数问题)优秀的代码就是要注意细微的细节
- 数值的整数次方
- 剑指offer面试题[11]-数值的正整数次方
- 《剑指offer》编程题java实现(四):数值的整数次方
- 71 数值的整数次方
- 71.数值的整数次方
- 10.数值的整数次方
- 数值的整数次方
- 数值的整数次方
- 剑指Offer面试题11数值的整数次方