分治思想求解X的M次幂方

 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, 其他同理

原文地址:https://www.cnblogs.com/Sunlnx/p/3406328.html