2015-05-25 158 views
1

这里的问题是:https://leetcode.com/problems/happy-number/函数返回false

我的解决办法:

static int count = 0; 
public static void Main(string[] args) 
{ 
    Console.WriteLine(happyNumber(19)); 
    Console.ReadLine(); 
} 

public static bool happyNumber(int a) 
{ 
    double result = 0; 
    Stack<int> stapel = new Stack<int>(); 
    //Split the integer into single digits and save them in a stack 
    while (a.ToString().Count() > 1) 
    { 
     stapel.Push(a % 10); 
     a = a/10; 
    } 
    if (a.ToString().Count() == 1) 
    { 
     stapel.Push(a); 
    } 
    // Add the square of the digits to get the result 
    foreach (var item in stapel) 
    { 
     result += Math.Pow((double)item, 2); 
    } 
    // Check if it's a happy number 
    if(result == 1.0) 
    { 
     return true; 
    } 
    // counter to stop if it is a endless loop 
    else if(count < 100) 
    { 
     count++; 
     happyNumber((int)result); 
    } 
    return false; 
} 

所以输入19是一个快乐号和4号if引导的从句是真实的跑。 您可以在if(result == 1.0)处设置断点来检查它。那么为什么我的函数返回false呢?

+0

检查是否(结果== 1) – Sachu

+0

是的,它仍然是true,但我的函数将返回false, – johnas

回答

2

你不必要地投掷到双倍。使resultint而不是double(或者如果您担心int的结果太大,则使其成为long)。呼叫与手动平方item,像这样替换到Math.Pow

result += item * item; 

控制流不进入if(result == 1.0)块是由于浮点值在内部表示的方式的原因。测试double之间的相等性是有问题的,因此(在这种情况下),您应该避免完全使用它们,因为它们不需要。

你也有一个递归调用在这里:

happyNumber((int)result); 

然而,这一呼吁不做任何事情,因为你不到底用返回任何有价值的东西。考虑将该行替换为:

return happyNumber((int)result); 

这将返回递归调用的值,而不是放弃它。

+0

我要改变它。谢谢。 – johnas

+0

编辑:啊,现在我明白了。非常感谢你。 – johnas

+0

不客气! – Quackmatic

2

你的函数是递归的,但你不会对递归调用的结果做任何事情。

如果更改:

happyNumber((int)result); 

要:

return happyNumber((int)result); 

然后你对19的结果是true。浮点数的比较还存在其他问题,但这可能是您的主要问题!

+0

哦,你是对的。谢谢你,先生。 – johnas

0

这是因为你的happyNumber方法调用本身(第3最后一行),然后从该调用它击中return true行 - 但只返回一个加紧堆到happyNumber方法....然后点击return false