2019年1/30日看到了一个好的方法,代码虽然多,但是没有一点冗余,思路清晰。:
string s = "";
List<int> visited = new List<int>();
while (n!=1)
{
s = n + "";
int newnum = 0;
foreach (char c in s)
{
int digit = (int)c - 48;
digit *= digit;
newnum += digit;
}
if (visited.Contains(newnum))
{
return false;
}
else
{
visited.Add(newnum);
}
n = newnum;
}
return true;
2018-12-21日重新做了一下这个题目
数学的方法: 击败百分之65%
public bool IsHappy(int n) {
if (n == 0)
return false;
int squares = n;
while (squares>=10)
{
int temp = 0;
while (squares>0)
{
temp += (squares % 10) * (squares % 10);
squares = squares / 10;
}
squares = temp;
}
if (squares == 1 || squares == 7)
return true;
else
return false;
}
}
指针的方法:击败 97 %
public static bool IsHappy(int n)
{
if (n == 0)
return false;
int slow = n, fast = n;
do
{
slow = digitSquaresSum(slow);//慢指针
fast = digitSquaresSum(fast);
fast = digitSquaresSum(fast);//快指针 比满指针多执行一次difitSquaresSum
} while (slow!=fast);//满指针和快指针结果相同,跳出循环
if (slow==1)
{
return true;
}
else
{
return false;
}
}
private static int digitSquaresSum(int n)//计算平方和
{
int squares = 0;
while (n!=0)
{
int temp = n % 10;
squares += (temp * temp);
n = n / 10;
}
return squares;
}
下面是我以前写的:
不得不说,快乐数这道题 get me happy,以为这道题在我做的时候想到了递归,并一次性实现,也就是掌握了递归的用法。
分析:
直接将数字转换成数组的法宝先用上:
int[] arr = a.ToString().Select(s => int.Parse(s.ToString())).ToArray();
然后通过递归的方法完成累加直到得出结果即可,答案如下:
static void Main(string[] args)
{
int a = 19;
bool b = GetHappy(a);
Console.Write(b);
Console.ReadKey();
}
private static bool GetHappy(int a)
{
bool f = false;
int number = 0;
return NewMethod(a, ref f, ref number);
}
private static bool NewMethod(int a, ref bool f, ref int number)
{
int[] arr = a.ToString().Select(s => int.Parse(s.ToString())).ToArray();
for (int i = 0; i < arr.Length; i++)
{
number += arr[i] * arr[i];
}
if (number == 1 || f == true)
{
f = true;
}
else if (number != 1)
{
a = number;
number = 0;
NewMethod(a, ref f, ref number); //递归
}
else
{
f = false;
}
return f;
}