// 此方法能减少乘法次数, O(1) #include <iostream> #include <cassert> using namespace std; // do not consider doulbe overflow double pow(double base, int exponent) { // initialize int i = 0; assert(base!=0 && exponent>=0);// if the condition is true, go ahead, else break; if (exponent==0) return 1.0; double power = 1.0; unsigned int mask = 1; double ret = 1.0; for (i=0; i<32; ++i) { if (i==0) power = base; else power = power*power; if ( ((mask<<i) & (unsigned int)exponent) != 0) { ret = ret * power; } } return ret; } int main(int argc, char* argv[]) { cout<<pow(2.5,2)<<endl; cout<<pow(-2.5,2)<<endl; cout<<pow(1,0)<<endl; cout<<pow(100,3)<<endl; cout<<pow(-100,4)<<endl; return 0; }