计算100以内所有符合勾股定理的整数集
大家都知道勾股定理的公式了,即a *a+b*b=c*c我们用程序怎么来计算100以内所有符合勾股定理的整数集呢?
我们先来看一下怎么分析这个问题:
1. 首先a、b、c三个数不能相等,并且c>a,c>b,这是很显而易见的。至于a和b的大小关系,我们暂且不知。
2. 假设a=b,我们则得到a*a+a*a=c*c,即2a*a=c*c,推出c=a*sqrt(2),这与a、b、c为整数矛盾,因此a!=b,所以我们可以假设a<b<c。
3. 我们可以固定a和b的值,求得a*a+b*b的值,并利用sqrt开根,求得c的值,再判断得到的c的值是否为正整数,如果为正整数,则符合条件,找到一组数集。
4. 固定a的值,递增b的值重复执行步骤3,直到b大于100后,递增a的值,使b的值归位,重复执行步骤3,直到a的值大于100后,跳出并结束查找。
static void Main()
{
var list = GetPythagoreanList(100);
if (list == null)
{
Console.WriteLine("list is null");
return;
}
foreach (var item in list.Where(item => item.Length >= 3))
{
Console.WriteLine("firstSide:{0},secondSide:{1},thirdSide:{2}", item[0], item[1], item[2]);
}
Console.WriteLine("Total is {0}", list.Count());
}
static IEnumerable<int[]> GetPythagoreanList(Int32 maxNumber)
{
var list = new List<Int32[]>();
// 默认第一个数<第二个数<第三个数
var firstSideMax = maxNumber - 2;
var secondSideMax = maxNumber - 1;
for (var i = 1; i < firstSideMax; i++)
{
for (var j = i + 1; j < secondSideMax; j++)
{
// 两个数的平方和
var squareTotal = i * i + j * j;
// 两个数的平方和的平方根(即为第三个数)
var squareRoot = Math.Sqrt(squareTotal);
// 第三个数是否大于最大的数
if (squareRoot > maxNumber) continue;
// 第三个数是否为整数
if (!IsInt(squareRoot.ToString())) continue;
list.Add(new[] { i, j, Convert.ToInt32(squareRoot) });
}
}
return list;
}
/// <summary>
/// 判断是否为整数
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
static Boolean IsInt(String number)
{
return Regex.IsMatch(number, @"\d") && !number.Contains(".");
}
详细请见“.Net港湾”相关帖子