我正在使用c#进行编码。我正在寻找找到两个输入值的最大公分母。 有一些有效的数字,例如100&200、50&150、2&12等。但是当我输入78以外的任何数字时,我都会不断收到堆栈溢出消息。
我在下面附上了我的代码。
有人可以告诉我为什么我会收到此消息吗?
using System;
namespace Euclid_App
{
class Euclidbackground
{
public static long GreatestCommoner(long first, long second)
{
while (first != second)
{
if (first > second)
{
return GreatestCommoner(first - first , second);
}
else
{
return GreatestCommoner(first, second - first);
}
}
return first;
}
}
class Program
{
static void Main(string[] args)
{
long onenum;
long twonum;
Console.WriteLine("Type first number:");
onenum = Convert.ToInt64(Console.ReadLine());
Console.WriteLine("Type second number:");
twonum = Convert.ToInt64(Console.ReadLine());
long answer = Euclidbackground.GreatestCommoner(onenum, twonum);
Console.WriteLine(answer);
Console.ReadKey();
}
}
}
答案 0 :(得分:2)
这是一个错字:
//this is always 0
return GreatestCommoner(first - first , second);
将此行替换为:
return GreatestCommoner(first - second, second);
顺便说一句,这个while循环是不必要的,因为它只有一个迭代,所以您应该用if语句替换它。
P.S。您可能需要为输入参数添加一些验证。像这样:
Debug.Assert(first>0);
Debug.Assert(second>0);
可以保护您免受无效呼叫的困扰。
P.P.S。另外,练习调试技巧。简单明了的东西:
Console.WriteLine(first+" "+second);
将帮助您更好地理解问题。如果您拥有IDE,则应该可以使用更方便的调试工具。