package main
import (
"fmt"
"strconv"
)
func main() {
/*
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,
也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
1**2 + 9**2 = 82
8**2 + 2**2 = 68
6**2 + 8**2 = 100
1**2 + 0**2 + 0**2 = 1
*/
for i := 19; i < 2021; i++ {
s := strconv.Itoa(i)
res := happy(s)
if res == "快乐数" {
fmt.Println("是快乐数:", i)
} else if res == "OK" {
fmt.Println("非快乐数:", i)
}
}
}
func happy(n string) string {
//str := string(n[0])
//fmt.Println(str) //1
//fmt.Printf("%T
", str) //string
//str2 := string(n[1])
//fmt.Printf("%T
", str2) //string
//a, _:= strconv.Atoi(str)
//b, _ := strconv.Atoi(str2)
//str3 := str + str2
//fmt.Println(str3) //19
//fmt.Println(a+b) //10
if len(n) == 2 {
//fmt.Println("==")
a, _ := strconv.Atoi(string(n[0]))
b, _ := strconv.Atoi(string(n[1]))
sum := a*a + b*b
fmt.Println("len(2)", n, sum)
if sum == 1 {
//fmt.Println("恭喜找到快乐数")
return "快乐数"
}
sum2 := strconv.Itoa(sum)
return happy(sum2);
} else if len(n) == 3 {
//fmt.Println("====")
a, _ := strconv.Atoi(string(n[0]))
b, _ := strconv.Atoi(string(n[1]))
c, _ := strconv.Atoi(string(n[2]))
sum := a*a + b*b + c*c
fmt.Println("len(3)", n, sum)
if sum == 1 {
//fmt.Println("恭喜找到快乐数")
return "快乐数"
}
sum2 := strconv.Itoa(sum)
return happy(sum2);
} else if len(n) == 4 {
//fmt.Println("=====")
a, _ := strconv.Atoi(string(n[0]))
b, _ := strconv.Atoi(string(n[1]))
c, _ := strconv.Atoi(string(n[2]))
d, _ := strconv.Atoi(string(n[3]))
sum := a*a + b*b + c*c + d*d
fmt.Println("len(4)", n, sum)
if sum == 1 {
//fmt.Println("恭喜找到快乐数")
return "快乐数"
}
sum2 := strconv.Itoa(sum)
return happy(sum2);
} /*else if len(n) == 1 {
//fmt.Println("=====")
a, _ := strconv.Atoi(string(n[0]))
sum := a*a
//fmt.Println("len(1)",sum)
if sum == 1 {
//fmt.Println("恭喜找到快乐数")
return "快乐数"
}
sum2 := strconv.Itoa(sum)
return happy(sum2);
}*/
/*上面的代码报错
运行时:goroutine堆栈超过100000000字节的限制
致命错误:堆栈溢出*/
return "OK" //如果len为1,就直接return结束函数
}
/*
是快乐数: 1995
非快乐数: 1996
非快乐数: 1997
非快乐数: 1998
非快乐数: 1999
非快乐数: 2000
非快乐数: 2001
非快乐数: 2002
是快乐数: 2003
非快乐数: 2004
非快乐数: 2005
非快乐数: 2006
非快乐数: 2007
是快乐数: 2008
非快乐数: 2009
非快乐数: 2010
非快乐数: 2011
非快乐数: 2012
非快乐数: 2013
非快乐数: 2014
非快乐数: 2015
非快乐数: 2016
非快乐数: 2017
非快乐数: 2018
是快乐数: 2019
非快乐数: 2020
*/