題目描述:給定數字a,b,求a^b。
思路:
解法包括常規求冪、二分求冪、快速求冪(位運算)。
每一種求法中,要根據b的值進行討論,b=0,>0,<0。
1)常規求冪
常規求冪即是根據ans=a*a*a*a。。。
根據b的個數來就行求解
2)二分求冪
二分求冪是可以將乘法進行分組
比如a*a*a*a*a*a=(a*a)*(a*a)*(a*a),這樣就將6次乘法變成了3次乘法運算。
所以二分求冪即是根據矩陣乘法的結合律,減少重複計算的次數。
3)快速求冪(位運算)
因為冪數b可以看成是乙個二進位制,每乙個1都可以看成是2的倍數。
a^21=(a^16)*(a^4)*(a^1)。
而21的二進位制表示為10101。
而每次將b的二進位制從右到左與1進行&運算。
**如下:
結果如下:#includeusing namespace std;
double pow1(double, int);//常規求冪
double pow2(double, int);//二分求冪
double pow3(double, int);//快速求冪,位運算
int main()
system("pause");
return 0;
}//常規求冪
double pow1(double a, int b)
return r;
} if (b < 0)
return 1/r; }
}//二分求冪
double pow2(double a, int b)
if (b > 0)
base *= base;
b /= 2;
} return r;
} if (b < 0)
c /=2;
base *= base;
} return 1 / r; }
}//快速求冪,位運算
double pow3(double a, int b)
if (b > 0)
b >>=1;
base *= base;
} return r;
} else
c >>=1;
base *= base;
} return 1 / r;
}}

化簡:
通過對b的值進行討論對**進行化簡。
#includeusing namespace std;
double pow1(double, int);//常規求冪
double pow2(double, int);//二分求冪
double pow3(double, int);//快速求冪,位運算
int main()
system("pause");
return 0;
}//常規求冪
double pow1(double a, int b)
return b > 0 ? r : 1 / r;
}//二分求冪
double pow2(double a, int b)
int c = abs(b);
double r = 1;
while (c)
return b > 0 ? r : 1 / r;
}//快速求冪,位運算
double pow3(double a, int b)
int c = abs(b);
double r = 1.0;
while (c)
return b > 0 ? r : 1 / r;
}
常規求冪 二分求冪 快速位求冪
我是因為刷杭電的題目了解到了冪運算,那就貼一下杭電的題目好了 然後在貼一下別人關於冪運算的部落格 題目描述 給定數字a,b,求a b。思路 解法包括常規求冪 二分求冪 快速求冪 位運算 每一種求法中,要根據b的值進行討論,b 0,0,0。1 常規求冪 常規求冪即是根據ans aaa a。根據b的個數...
二分求冪,快速求冪
1 2 3 4 5 6 7 8 9 10 11 12 intpow3 inta,intb returnr 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 intpow4 intx,intn result x n 1 whil...
快速求冪二分演算法
includeint a,b void input void pow1 base base base b b 2 每次進行縮半,對base base base這一步起到約束作用 printf d n r int main 二分演算法 求a b 二分法 此處b b 2 體現二分 base a base...