Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "flag"
- "fmt"
- "math/big"
- "os"
- "time"
- )
- var (
- number = flag.Int64("n", 196, "The number to check")
- max = flag.Int64("m", 100000, "Max number of steps run")
- timeout = flag.Duration("t", 10*time.Second, "Timeout for the lychrel test")
- )
- func main() {
- flag.Parse()
- if *number < 10 {
- fmt.Println("The number needs to be at least 10")
- os.Exit(0)
- }
- go func() {
- <-time.After(*timeout)
- fmt.Printf("%d is PROBABLY a Lychrel number (timeout after %s)\n", *number, *timeout)
- os.Exit(0)
- }()
- if probably, result := lychrel(*number, *max); !probably {
- fmt.Println(*number, "is NOT a Lychrel number (since", result, "is a palindrome)")
- } else {
- fmt.Println(*number, "is PROBABLY a Lychrel number (after", *max, "steps)")
- }
- }
- func isPalindrome(bi *big.Int) bool {
- s := bi.String()
- return s == reverse(s)
- }
- func reverse(input string) string {
- n := 0
- rune := make([]rune, len(input))
- for _, r := range input {
- rune[n] = r
- n++
- }
- rune = rune[0:n]
- for i := 0; i < n/2; i++ {
- rune[i], rune[n-1-i] = rune[n-1-i], rune[i]
- }
- return string(rune)
- }
- func lychrel(number, max int64) (bool, *big.Int) {
- n := big.NewInt(number)
- if isPalindrome(n) {
- return false, n
- }
- for i := int64(0); i < max; i++ {
- b := new(big.Int)
- b.SetString(reverse(n.String()), 10)
- n = n.Add(n, b)
- if isPalindrome(n) {
- return false, n
- }
- }
- return true, big.NewInt(0)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement