From 681c9a12b871fbe18d33004aea527e0f089dc59e Mon Sep 17 00:00:00 2001 From: VicRen Date: Thu, 19 Nov 2020 11:36:28 +0800 Subject: [PATCH] 47: distinct primes factors --- 47_distinct_primes_factors/main.go | 71 +++++++++++++++++++++++++ 47_distinct_primes_factors/main_test.go | 40 ++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 47_distinct_primes_factors/main.go create mode 100644 47_distinct_primes_factors/main_test.go diff --git a/47_distinct_primes_factors/main.go b/47_distinct_primes_factors/main.go new file mode 100644 index 0000000..80a01c7 --- /dev/null +++ b/47_distinct_primes_factors/main.go @@ -0,0 +1,71 @@ +package main + +import ( + "fmt" + "math" + "sort" +) + +func main() { + nums := make([]int, 0) + i := 2 + for { + primes := distinctPrimesOf(i) + if len(primes) == 4 { + l := len(nums) + if l == 0 || (nums[l-1] == i-1) { + nums = append(nums, i) + } else { + nums = []int{i} + } + if len(nums) == 4 { + break + } + } + i++ + } + fmt.Println(nums) +} + +func distinctPrimesOf(n int) []int { + m := make(map[int]struct{}) + max := int(math.Sqrt(float64(n))) + divider := 2 + for divider <= max { + if n%divider == 0 { + if isPrime(divider) { + m[divider] = struct{}{} + } + x := n / divider + if isPrime(x) { + m[x] = struct{}{} + } + } + divider++ + } + var ret []int + for k := range m { + ret = append(ret, k) + } + sort.Ints(ret) + return ret +} + +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/47_distinct_primes_factors/main_test.go b/47_distinct_primes_factors/main_test.go new file mode 100644 index 0000000..aaed401 --- /dev/null +++ b/47_distinct_primes_factors/main_test.go @@ -0,0 +1,40 @@ +package main + +import ( + "reflect" + "testing" +) + +func Test_distinctPrimesOf(t *testing.T) { + type args struct { + n int + } + tests := []struct { + name string + args args + want []int + }{ + { + "4", + args{4}, + []int{2}, + }, + { + "14", + args{14}, + []int{2, 7}, + }, + { + "644", + args{644}, + []int{2, 7, 23}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := distinctPrimesOf(tt.args.n); !reflect.DeepEqual(got, tt.want) { + t.Errorf("distinctPrimesOf() = %v, want %v", got, tt.want) + } + }) + } +}