23: non-abundant sums

This commit is contained in:
VicRen
2020-10-22 12:38:41 +08:00
parent 932336046a
commit 66813aa5ca
4 changed files with 163 additions and 6 deletions
+82
View File
@@ -0,0 +1,82 @@
package main
import (
"reflect"
"testing"
)
func Test_isAbundantNumber(t *testing.T) {
tt := []struct {
name string
input int
want bool
}{
{
"1",
1,
false,
},
{
"12",
12,
true,
},
{
"28",
28,
false,
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
got := isAbundantNumber(tc.input)
if got != tc.want {
t.Errorf("isAbundantNumber() = %v, want %v", got, tc.want)
}
})
}
}
func Test_sumOfDivisors(t *testing.T) {
tt := []struct {
name string
input int
want int
}{
{
"1",
1,
0,
},
{
"2",
2,
1,
},
{
"4",
4,
3,
},
{
"12",
12,
16,
},
{
"28",
28,
28,
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
got := sumOfDivisors(tc.input)
if !reflect.DeepEqual(got, tc.want) {
t.Errorf("sumOfDivisors() = %d, want %d", got, tc.want)
}
})
}
}
+55
View File
@@ -0,0 +1,55 @@
package main
import "fmt"
func main() {
sum := 0
var nums []int
ans := make(map[int]struct{})
for i := 1; i < 28123; i++ {
if isAbundantNumber(i) {
ans[i] = struct{}{}
}
find := false
for k := range ans {
d := i - k
if d < 0 {
break
}
if _, f := ans[d]; f {
fmt.Printf("%d = %d + %d\n", i, k, d)
find = true
break
}
}
if !find {
sum += i
nums = append(nums, i)
}
}
fmt.Println("abundant numbers:", ans)
fmt.Println("sum:", sum, "nums:", nums)
}
func isAbundantNumber(input int) bool {
return sumOfDivisors(input) > input
}
func sumOfDivisors(input int) int {
if input < 2 {
return 0
}
sum := 0
i := 1
for i*i <= input {
if input%i == 0 {
sum += i
j := input / i
if j != i && j != input {
sum += j
}
}
i++
}
return sum
}