Alg | 约数

列出约数

code

朴素

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func getDivisors(n int) []int {
	res := make([]int, 0)

	// 约数是成对出现的,添加一个,再添加除的的结果的那个
	for i := 1; i <= n/i; i++ {
		if n%i == 0 {
			res = append(res, i)
			if n/i != i { // 不重复添加
				res = append(res, n/i)
			}
		}
	}

	sort.Ints(res)
	return res
}

约数个数

约数之和

最大公约数

更相减损术

a,bN,ab,gcd(a,b)=gcd(b,a  b)=gcd(a,a  b) \forall a,b \in \mathbb{N},a \ge b, \qquad gcd(a,b) = gcd(b, a \ - \ b) = gcd(a,a \ - \ b)

a,bN,gcd(2a,2b)=2gcd(a,b) \forall a,b \in \mathbb{N}, \qquad gcd(2a,2b) = 2gcd(a,b)

Proof

Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func gcd(a, b int) int {
	for a != b {
		if a > b {
			a -= b
		} else {
			b -= a
		}
	}
	return a
}

欧几里得(辗转相除法)

a,bN,b0,gcd(a,b)=gcd(b,a mod b) \forall a,b \in \mathbb{N},b \neq 0, \qquad gcd(a,b) = gcd(b, a \ mod \ b)

Proof

Code

1
2
3
4
5
6
func gcd(a, b int) int {
	if b != 0 {
		return gcd(b, a%b)
	}
	return a
}