Java中如何編寫(xiě)一個(gè)數(shù)的n次方(冪運(yùn)算)?
本文介紹了使用pow函數(shù)和自定義for循環(huán)計(jì)算冪的O(n)時(shí)間復(fù)雜度方法,然后重點(diǎn)講解了快速冪算法的分治思想,以及從二進(jìn)制角度的解釋,包括如何通過(guò)位運(yùn)算和循環(huán)迭代實(shí)現(xiàn)高效計(jì)算,給出了Java代碼實(shí)現(xiàn),
一、算法簡(jiǎn)介
1.使用pow函數(shù)和自定義的for循環(huán)的時(shí)間復(fù)雜度為O(n)
/**計(jì)算x的y次方**/
//1.使用Pow函數(shù)
double res = Math.pow(x,y);
//2.自定義for循環(huán)
double res=x;
for(int i=1;i<y;i++){
res=res*x;
}2.快速冪的時(shí)間復(fù)雜度為O(log n)
二、快速冪的思想
(1)從分冶的角度出發(fā),計(jì)算 
①假設(shè)y為偶數(shù),即計(jì)算
=
我們將指數(shù) y,每次劃分為 ,上述式子不需要進(jìn)行8次循環(huán),而只需要三步即可完 成,注
和
是為了讓讀者好理解,而重復(fù)寫(xiě)的。
②假設(shè)y為奇數(shù),即計(jì)算
=
指數(shù)部分為奇數(shù)是可以化解成(1+偶數(shù))的形式的,這樣我們可以把指數(shù)為1的底 拿出來(lái)當(dāng)答案來(lái)乘,偶數(shù)部分同①繼續(xù)化解即可
偽代碼
x=3,y=10,res=1
while(指數(shù)y不等于0){
if(指數(shù)y為奇數(shù)){
res = res * x //提取底數(shù)出來(lái),作為乘積
}
y=y/2 //指數(shù)二分
x=x*x //底數(shù)平方
}(2) 從二進(jìn)制的角度出發(fā)
如8的二進(jìn)制位:8=;
二進(jìn)制轉(zhuǎn)十進(jìn)制:=
=8
那么=
=
(倒序?qū)?
觀察發(fā)現(xiàn):指數(shù)部分是由兩部分組成,第一部分是0001,第二部分是 ,發(fā)現(xiàn)2是循環(huán)增大的(用代碼x=x*x,循環(huán)迭代出來(lái),但是否使用則看二進(jìn)制位是否為‘1’),由于二進(jìn)制要么為0要么為1(用代碼 y&1==1,來(lái)判斷)
再舉個(gè)詳細(xì)的例子(計(jì)算):
11=1011
=
偽代碼:
x=3,y=11,res=1
while( (1011)y從尾往頭讀取){
if( (y&1)==1){
res=res*x; //二進(jìn)制位不為0,則相乘
//如第一個(gè)1:res=1*3,
//第二個(gè)1:res=res*3^2
//第三個(gè)數(shù)為0:不相乘,但x是不斷平方的,此時(shí)是x^4
//第四個(gè)數(shù)為1:res=res*3^8 ,注意哦,平方是在if后面
}
二進(jìn)制右移一位
x=x*x; //依次迭代3^0,3^1,3^2,3^4,3^8................
}三、代碼實(shí)現(xiàn)
public static double FastPow(int x,int y){
double res= 1;
while (y!=0){
if(y%2 == 1){ //指數(shù)為奇數(shù),也可以利用位運(yùn)算:(y&1)==1 (與操作): 判斷 n 二進(jìn)制最右一位是否為 1
res *= x;
}
y=y/2; //指數(shù)循環(huán)二分,y>>=1 (移位操作): n 右移一位(可理解為刪除最后一位,即除以2)。
x=x*x; //底數(shù)平分
}
return res;
}
到此這篇關(guān)于Java中如何編寫(xiě)一個(gè)數(shù)的n次方(冪運(yùn)算)?的文章就介紹到這了,更多相關(guān)Java中的冪運(yùn)算(冪函數(shù))內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決@value獲取不到y(tǒng)aml數(shù)組的問(wèn)題
文章介紹了在使用YAML配置文件時(shí),通過(guò)@Value注解獲取整數(shù)和數(shù)組列表的配置方法,并提供了兩種解決方案:一種適用于非嵌套列表,另一種適用于嵌套列表等復(fù)雜配置2024-11-11
SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程
這篇文章給大家介紹了SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01
java 商戶PC端接入支付寶支付的實(shí)現(xiàn)方法
這篇文章主要介紹了java 商戶PC端接入支付寶支付的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
SpringBoot如何獲取application.properties中自定義的值
這篇文章主要介紹了SpringBoot獲取application.properties中的自定義的值,目錄結(jié)構(gòu)文件代碼給大家列舉的非常詳細(xì),需要的朋友可以參考下2021-09-09
Java static方法用法實(shí)戰(zhàn)案例總結(jié)
這篇文章主要介紹了Java static方法用法,結(jié)合具體案例形式總結(jié)分析了java static方法功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
IDEA與MyEclipse代碼量統(tǒng)計(jì)方式
文章介紹在項(xiàng)目中不安裝第三方工具統(tǒng)計(jì)代碼行數(shù)的方法,分別說(shuō)明MyEclipse通過(guò)正則搜索(排除空行和注釋)及IDEA使用Statistic插件或調(diào)整搜索設(shè)置(修改ide.usages.page.size)的兩種操作方式,并強(qiáng)調(diào)需根據(jù)需求靈活選擇2025-08-08

