53: combinatoric selections

This commit is contained in:
VicRen
2020-12-05 21:44:29 +08:00
parent 8e6b84ac8d
commit 2862eb2c1d
2 changed files with 87 additions and 0 deletions

View File

@@ -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
}

View File

@@ -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)
}
})
}
}