From 8b1bf8619f7ea63318b1f9f6d205f3e5930b073f Mon Sep 17 00:00:00 2001 From: VicRen Date: Wed, 4 Nov 2020 09:56:19 +0800 Subject: [PATCH] 34: digit factorials --- 34_digit_factorials/main.go | 43 ++++++++++++ 34_digit_factorials/main_test.go | 108 +++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 34_digit_factorials/main.go create mode 100644 34_digit_factorials/main_test.go diff --git a/34_digit_factorials/main.go b/34_digit_factorials/main.go new file mode 100644 index 0000000..14b4992 --- /dev/null +++ b/34_digit_factorials/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "strconv" +) + +func main() { + sum := 0 + max := factorialOf(9) * 10 + for i := 3; i < max; i++ { + if sumNumberFactorials(splitNumber(i)) == i { + sum += i + } + } + fmt.Println("sum:", sum) +} + +func sumNumberFactorials(ns []int) int { + sum := 0 + for _, n := range ns { + sum += factorialOf(n) + } + return sum +} + +func splitNumber(n int) []int { + var ret []int + str := strconv.Itoa(n) + for _, c := range str { + i, _ := strconv.Atoi(string(c)) + ret = append(ret, i) + } + return ret +} + +func factorialOf(n int) int { + p := 1 + for i := n; i > 0; i-- { + p *= i + } + return p +} diff --git a/34_digit_factorials/main_test.go b/34_digit_factorials/main_test.go new file mode 100644 index 0000000..25762df --- /dev/null +++ b/34_digit_factorials/main_test.go @@ -0,0 +1,108 @@ +package main + +import ( + "reflect" + "testing" +) + +func Test_factorialOf(t *testing.T) { + type args struct { + n int + } + tt := []struct { + name string + args args + want int + }{ + { + "1", + args{1}, + 1, + }, + { + "2", + args{2}, + 2, + }, + { + "4", + args{4}, + 24, + }, + { + "10", + args{10}, + 3628800, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + if got := factorialOf(tc.args.n); got != tc.want { + t.Errorf("factorialOf() = %v, want %v", got, tc.want) + } + }) + } +} + +func Test_splitNumber(t *testing.T) { + type args struct { + n int + } + tt := []struct { + name string + args args + want []int + }{ + { + "13", + args{13}, + []int{1, 3}, + }, + { + "123", + args{123}, + []int{1, 2, 3}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + if got := splitNumber(tc.args.n); !reflect.DeepEqual(got, tc.want) { + t.Errorf("splitNumber() = %v, want %v", got, tc.want) + } + }) + } +} + +func Test_sumNumberFactorials(t *testing.T) { + type args struct { + ns []int + } + tt := []struct { + name string + args args + want int + }{ + { + "1", + args{[]int{1}}, + 1, + }, + { + "12", + args{[]int{1, 2}}, + 3, + }, + { + "123", + args{[]int{1, 2, 3}}, + 9, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + if got := sumNumberFactorials(tc.args.ns); got != tc.want { + t.Errorf("sumNumberFactorials() = %v, want %v", got, tc.want) + } + }) + } +}