summaryrefslogtreecommitdiff
path: root/p71
diff options
context:
space:
mode:
authorache <ache@ache.one>2018-09-05 00:56:09 +0200
committerache <ache@ache.one>2018-09-05 00:56:09 +0200
commit2bae1659ba8eb742f737ccb31d9ad7f25f9599f7 (patch)
treed8ad2b75cefbcc70f9c31f154682a44299958f67 /p71
Init commit
Diffstat (limited to 'p71')
-rw-r--r--p71/p_71.cpp20
-rw-r--r--p71/p_71.go118
2 files changed, 138 insertions, 0 deletions
diff --git a/p71/p_71.cpp b/p71/p_71.cpp
new file mode 100644
index 0000000..a2d3693
--- /dev/null
+++ b/p71/p_71.cpp
@@ -0,0 +1,20 @@
+#include <iostream>
+
+const int digitToFact[] = {
+ [0] = 1,
+ [1] = 1,
+ [2] = 2,
+ [3] = 6,
+ [4] = 24,
+ [5] = 120,
+ [6] = 720,
+ [7] = 5040,
+ [8] = 40320,
+ [9] = 362880
+};
+
+int main() {
+
+
+ return EXIT_SUCCESS;
+}
diff --git a/p71/p_71.go b/p71/p_71.go
new file mode 100644
index 0000000..941989d
--- /dev/null
+++ b/p71/p_71.go
@@ -0,0 +1,118 @@
+package main
+
+import (
+ "fmt"
+ "math/big"
+)
+
+
+var digitToFact= map[rune]*big.Int{
+ '0' : big.NewInt(1),
+ '1' : big.NewInt(1),
+ '2' : big.NewInt(2),
+ '3' : big.NewInt(6),
+ '4' : big.NewInt(24),
+ '5' : big.NewInt(120),
+ '6' : big.NewInt(720),
+ '7' : big.NewInt(5040),
+ '8' : big.NewInt(40320),
+ '9' : big.NewInt(362880),
+}
+
+func sliceIndexOfUint64( slice[]uint64, x uint64) int {
+ for i,e := range slice {
+ if e == x {
+ return i;
+ }
+ }
+ return -1
+}
+
+
+
+func main() {
+
+ number := [1000000]int{};
+
+ for init_int := uint64(0) ; init_int < 1000000 ; init_int++ {
+ init := big.NewInt(0);
+ tmp := big.NewInt(0);
+ init.SetUint64(init_int)
+ tmp.SetUint64(init_int)
+
+ cmp := 0;
+
+ pile := make([]uint64, 0, 61);
+
+
+ isKnow := func ( e *big.Int ) bool {
+ if e.IsUint64() {
+ v := e.Uint64();
+
+ if sliceIndexOfUint64(pile, v) >= 0 {
+ return true;
+ }
+
+ if v < 1000000 {
+ return number[v] != 0;
+ }
+ }
+ return false;
+ }
+
+ for b := true ; b ; b = !isKnow( tmp ) && cmp < 60 {
+
+ if tmp.IsUint64() {
+ pile = append(pile, tmp.Uint64());
+ }
+
+ tmp2 := big.NewInt(0);
+
+ for _,c := range tmp.String() {
+ tmp2 = tmp2.Add(tmp2, digitToFact[c]);
+ }
+
+ cmp += 1;
+ tmp = tmp2;
+ }
+
+ if isKnow( tmp ) {
+
+ v := tmp.Uint64()
+ i := sliceIndexOfUint64(pile, v)
+
+ if sliceIndexOfUint64([]uint64{169, 871, 872, 69, 145, 540, 78}, init_int) >= 0 {
+ }
+
+ if( i >= 0 ) {
+
+ for index := i ; index < len(pile) ; index++ {
+ number[ pile[index] ] = len(pile) - i;
+ }
+ for index := i - 1 ; index >= 0 ; index-- {
+ number[ pile[index] ] = i - index + number[ pile[i] ];
+ }
+ } else if v < 1000000 && number[v] != 0 {
+ cmp += number[v];
+ for i,e := range pile {
+ if e < 1000000 {
+ if number[e] == 0 {
+ number[ e ] = cmp - i;
+ }
+ }
+ }
+ }
+ }
+
+ if number[init_int] == 60 {
+ fmt.Printf("#%d %d\n", number[init_int], init_int);
+ }
+
+
+ }
+
+
+}
+
+
+