diff --git a/53_combinatoric_selections/main.go b/53_combinatoric_selections/main.go new file mode 100644 index 0000000..6598f18 --- /dev/null +++ b/53_combinatoric_selections/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "fmt" + "math/big" + "strconv" +) + +func main() { + result := 0 + limit, _ := (&big.Int{}).SetString("1000000", 0) + nLimit := 100 + for i := 1; i <= nLimit; i++ { + for j := 0; j <= i; j++ { + bi, _ := (&big.Int{}).SetString(strconv.Itoa(i), 0) + fi := factorialOf(bi) + bj, _ := (&big.Int{}).SetString(strconv.Itoa(j), 0) + fj := factorialOf(bj) + bk, _ := (&big.Int{}).SetString(strconv.Itoa(i-j), 0) + fk := factorialOf(bk) + mik := fj.Mul(fj, fk) + dvk := mik.Div(fi, mik) + if x := dvk.Add(dvk, limit.Neg(limit)); x.Int64() >= 0 { + result++ + } + } + } + fmt.Println(result) +} + +func factorialOf(n *big.Int) *big.Int { + one, _ := (&big.Int{}).SetString("1", 0) + if n.Int64() <= 2 { + return one + } + p, _ := (&big.Int{}).SetString("1", 0) + i, _ := (&big.Int{}).SetString("2", 0) + for { + p = p.Mul(p, i) + if i.String() == n.String() { + break + } + i = i.Add(i, one) + } + return p +} diff --git a/53_combinatoric_selections/main_test.go b/53_combinatoric_selections/main_test.go new file mode 100644 index 0000000..70cef87 --- /dev/null +++ b/53_combinatoric_selections/main_test.go @@ -0,0 +1,41 @@ +package main + +import ( + "math/big" + "reflect" + "testing" +) + +func Test_factorialOf(t *testing.T) { + type args struct { + n *big.Int + } + tests := []struct { + name string + args args + want *big.Int + }{ + { + "test1", + args{(&big.Int{}).SetInt64(0)}, + (&big.Int{}).SetInt64(1), + }, + { + "test2", + args{(&big.Int{}).SetInt64(3)}, + (&big.Int{}).SetInt64(6), + }, + { + "test2", + args{(&big.Int{}).SetInt64(5)}, + (&big.Int{}).SetInt64(120), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := factorialOf(tt.args.n); !reflect.DeepEqual(got, tt.want) { + t.Errorf("factorialOf() = %v, want %v", got, tt.want) + } + }) + } +}