Advertisement
Guest User

Untitled

a guest
Aug 29th, 2015
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "flag"
  5. "fmt"
  6. "math/big"
  7. "os"
  8. "time"
  9. )
  10.  
  11. var (
  12. number = flag.Int64("n", 196, "The number to check")
  13. max = flag.Int64("m", 100000, "Max number of steps run")
  14. timeout = flag.Duration("t", 10*time.Second, "Timeout for the lychrel test")
  15. )
  16.  
  17. func main() {
  18. flag.Parse()
  19.  
  20. if *number < 10 {
  21. fmt.Println("The number needs to be at least 10")
  22. os.Exit(0)
  23. }
  24.  
  25. go func() {
  26. <-time.After(*timeout)
  27. fmt.Printf("%d is PROBABLY a Lychrel number (timeout after %s)\n", *number, *timeout)
  28. os.Exit(0)
  29. }()
  30.  
  31. if probably, result := lychrel(*number, *max); !probably {
  32. fmt.Println(*number, "is NOT a Lychrel number (since", result, "is a palindrome)")
  33. } else {
  34. fmt.Println(*number, "is PROBABLY a Lychrel number (after", *max, "steps)")
  35. }
  36. }
  37.  
  38. func isPalindrome(bi *big.Int) bool {
  39. s := bi.String()
  40. return s == reverse(s)
  41. }
  42.  
  43. func reverse(input string) string {
  44. n := 0
  45. rune := make([]rune, len(input))
  46. for _, r := range input {
  47. rune[n] = r
  48. n++
  49. }
  50. rune = rune[0:n]
  51. for i := 0; i < n/2; i++ {
  52. rune[i], rune[n-1-i] = rune[n-1-i], rune[i]
  53. }
  54. return string(rune)
  55. }
  56.  
  57. func lychrel(number, max int64) (bool, *big.Int) {
  58. n := big.NewInt(number)
  59.  
  60. if isPalindrome(n) {
  61. return false, n
  62. }
  63.  
  64. for i := int64(0); i < max; i++ {
  65. b := new(big.Int)
  66. b.SetString(reverse(n.String()), 10)
  67. n = n.Add(n, b)
  68.  
  69. if isPalindrome(n) {
  70. return false, n
  71. }
  72. }
  73.  
  74. return true, big.NewInt(0)
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement