diff --git a/longest_collatz_sequence/collatz_test.go b/longest_collatz_sequence/collatz_test.go new file mode 100644 index 0000000..5b9fb30 --- /dev/null +++ b/longest_collatz_sequence/collatz_test.go @@ -0,0 +1,79 @@ +package main + +import "testing" + +func TestCollatzNext(t *testing.T) { + tt := []struct { + name string + input int + want int + }{ + { + "1", + 1, + 1, + }, + { + "2", + 2, + 1, + }, + { + "3", + 3, + 10, + }, + { + "13", + 13, + 40, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := CollatzNext(tc.input) + if got != tc.want { + t.Errorf("CollatzNext(%d)=%d, want %d", tc.input, got, tc.want) + } + }) + } +} + +func TestIsEven(t *testing.T) { + tt := []struct { + name string + input int + want bool + }{ + { + "1", + 1, + false, + }, + { + "2", + 2, + true, + }, + { + "99", + 99, + false, + }, + { + "100", + 100, + true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := IsEven(tc.input) + if got != tc.want { + t.Errorf("IsEven(%d)=%v, want %v", tc.input, got, tc.want) + } + }) + } +} diff --git a/longest_collatz_sequence/main.go b/longest_collatz_sequence/main.go new file mode 100644 index 0000000..144a5a5 --- /dev/null +++ b/longest_collatz_sequence/main.go @@ -0,0 +1,41 @@ +package main + +import "fmt" + +func main() { + num := 0 + ml := 0 + for i := 1000000; i > 1; i-- { + n := i + count := 1 + for { + n = CollatzNext(n) + if n == 1 { + break + } + count++ + } + if count > ml { + ml = count + num = i + } + } + fmt.Println("largest collatz is", num, "len:", ml) +} + +func CollatzNext(n int) int { + if n == 1 { + return 1 + } else if IsEven(n) { + return n / 2 + } else { + return 3*n + 1 + } +} + +func IsEven(n int) bool { + if n > 1 && n%2 == 0 { + return true + } + return false +}