1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 //递归形式分治求解 8 func power(x, m int) int { 9 if m == 0 { 10 return 1 11 } else { 12 y := power(x, m/2) 13 y = y * y 14 if m%2 != 0 { 15 y = x * y 16 } 17 return y 18 } 19 } 20 21 //迭代形式分治求解, 分析可用到如下图 22 func power2(x, m int) int { 23 y := 1 24 var k uint32 25 for k = 1; (m >> k) > 0; k++ { 26 } 27 k-- 28 for k > 0 { 29 y = y * y 30 if (m>>k)%2 > 0 { 31 y = y * x 32 } 33 k-- 34 } 35 y = y * y 36 if m%2 != 0 { 37 y = y * x 38 } 39 return y 40 } 41 func main() { 42 x := 2 43 m := 20 44 fmt.Println(x, "^", m, power(x, m)) 45 fmt.Println(x, "^", m, power2(x, m)) 46 }
//X的任意M次方,可从X的一次方,开始向上迭代产生,而路径的选择则根据M的二进制表示,来选择唯一路径,
比如X^15, 15的二进制形式为1111, 则选择的路径对应上图中的1111, 其他同理