常規求冪 二分求冪 快速位求冪

2021-07-11 04:33:44 字數 2117 閱讀 7201

題目描述:給定數字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...