diff --git a/25_1000_digit_fibonacci_number/main.go b/25_1000_digit_fibonacci_number/main.go new file mode 100644 index 0000000..8398574 --- /dev/null +++ b/25_1000_digit_fibonacci_number/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "fmt" + "math/big" +) + +func main() { + n := 11 + for { + fb := fibonacci(n) + fmt.Println("index =", n, "len =", len(fb.String())) + if numberDigits(fb) >= 1000 { + break + } + n++ + } + + fmt.Println("n is", n) +} + +func fibonacci(index int) *big.Int { + if index < 3 { + ret := (&big.Int{}).SetUint64(1) + return ret + } + fn := &big.Int{} + fn1 := (&big.Int{}).SetInt64(1) + fn2 := (&big.Int{}).SetInt64(1) + for i := 3; i <= index; i++ { + fn.Set(fn.Add(fn1, fn2)) + fn2.Set(fn1) + fn1.Set(fn) + } + return fn +} + +func numberDigits(num *big.Int) int { + return len(num.String()) +} diff --git a/25_1000_digit_fibonacci_number/main_test.go b/25_1000_digit_fibonacci_number/main_test.go new file mode 100644 index 0000000..f4507f2 --- /dev/null +++ b/25_1000_digit_fibonacci_number/main_test.go @@ -0,0 +1,46 @@ +package main + +import ( + "math/big" + "reflect" + "testing" +) + +func Test_fibonacci(t *testing.T) { + type args struct { + index int + } + tt := []struct { + name string + args args + want *big.Int + }{ + { + "1", + args{1}, + (&big.Int{}).SetBits([]big.Word{1}), + }, + { + "10", + args{10}, + (&big.Int{}).SetBits([]big.Word{big.Word(55)}), + }, + { + "12", + args{12}, + (&big.Int{}).SetBits([]big.Word{big.Word(144)}), + }, + { + "13", + args{13}, + (&big.Int{}).SetBits([]big.Word{big.Word(233)}), + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + if got := fibonacci(tc.args.index); !reflect.DeepEqual(got, tc.want) { + t.Errorf("fibonacci() = %v, want %v", got, tc.want) + } + }) + } +}