快乐数

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
*/

  

原文地址:https://www.cnblogs.com/yzg-14/p/12370272.html