From 64bab9cabf36185e0df5dec5e2030f2ff080ec90 Mon Sep 17 00:00:00 2001 From: VicRen Date: Sat, 7 Nov 2020 12:17:09 +0800 Subject: [PATCH] 37: truncatable primes --- 37_truncatable_primes/main.go | 68 ++++++++++++++++++++++++ 37_truncatable_primes/main_test.go | 83 ++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 37_truncatable_primes/main.go create mode 100644 37_truncatable_primes/main_test.go diff --git a/37_truncatable_primes/main.go b/37_truncatable_primes/main.go new file mode 100644 index 0000000..e5288a1 --- /dev/null +++ b/37_truncatable_primes/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + "strconv" +) + +func main() { + sum := 0 + start := 8 + count := 0 + for { + if count == 11 { + break + } + if isTruncatablePrimesL2R(start) && isTruncatablePrimesR2L(start) { + count++ + fmt.Println("tp:", start) + sum += start + } + start++ + } + fmt.Println("sum:", sum) +} + +func isTruncatablePrimesL2R(n int) bool { + s := strconv.Itoa(n) + for len(s) > 0 { + x, _ := strconv.Atoi(s) + if !isPrime(x) { + return false + } + s = s[1:] + } + return true +} + +func isTruncatablePrimesR2L(n int) bool { + s := strconv.Itoa(n) + for len(s) > 0 { + l := len(s) + x, _ := strconv.Atoi(s) + if !isPrime(x) { + return false + } + s = s[:l-1] + } + return true +} + +func isPrime(n int) bool { + if n <= 1 { + return false + } + res := n + //牛顿法求平方根 + for res*res > n { + res = (res + n/res) / 2 + } + divider := 2 + for divider <= res { + if n%divider == 0 { + return false + } + divider++ + } + return true +} diff --git a/37_truncatable_primes/main_test.go b/37_truncatable_primes/main_test.go new file mode 100644 index 0000000..122b362 --- /dev/null +++ b/37_truncatable_primes/main_test.go @@ -0,0 +1,83 @@ +package main + +import ( + "testing" +) + +func Test_isTruncatablePrimesL2R(t *testing.T) { + type args struct { + n int + } + tests := []struct { + name string + args args + want bool + }{ + { + "3797", + args{3797}, + true, + }, + { + "797", + args{797}, + true, + }, + { + "97", + args{97}, + true, + }, + { + "96", + args{96}, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isTruncatablePrimesL2R(tt.args.n); got != tt.want { + t.Errorf("isTruncatablePrimesL2R() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_isTruncatablePrimesR2L(t *testing.T) { + type args struct { + n int + } + tests := []struct { + name string + args args + want bool + }{ + { + "3797", + args{3797}, + true, + }, + { + "379", + args{379}, + true, + }, + { + "37", + args{37}, + true, + }, + { + "96", + args{96}, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isTruncatablePrimesR2L(tt.args.n); got != tt.want { + t.Errorf("isTruncatablePrimesR2L() = %v, want %v", got, tt.want) + } + }) + } +}