首页 > 解决方案 > 无法从三元组的总和计算毕达哥拉斯三元组的正确乘积

问题描述

毕达哥拉斯三元组是一组三个自然数,a < b < c,其中 a^2 + b^b = c^2。我们得到了毕达哥拉斯三元组的总和,在我的例子中是“数字”,我们必须找到 a、b 和 c 的最大乘积。我输入 5040,因为它是 1260、1680 和 2100 的总和。这三个数字形成了一个毕达哥拉斯三元组。我的程序应该给出 4445280000 输出,因为它是数字的乘积,但它给出了 150312704。这是我的代码。我看过 ab 和 c 的变量值是正确的,但程序没有打印它的正确乘积。

int noofcases = int.Parse(Console.ReadLine());
for (int i = 0; i < noofcases; i++)
{
    int number = int.Parse(Console.ReadLine());
    long result = -1;
    int a, b, c;
    for( a = 1; a <= number/3; a++)
    {
        b = (((number * number) - (2 * a * number)) / ((2 * number) - (2 * a)));
        c = number - a - b;
        if((a*a) + (b*b) == (c*c))
        {
            result = (a * b * c);
        }
    }
    Console.WriteLine(result);
}

标签: c#

解决方案


C# 中的anint是一个 32 位有符号整数,其范围在 -2,147,483,648 和 2,147,483,647 之间。

这意味着可以存储在 anint中的最大值是 2,147,483,647。您的期望值 4,445,280,000 是最大值的两倍多。

当您的int值超过最大值 2,147,483,647 时,它将滚动到 -2,147,483,648,然后倒数回 0。

因此,4,445,280,000 将变成 150,312,704,正如您所经历的那样。

将along用于您的结果将不起作用,因为任何乘以 an的输出将始终是 an ,除非您使用显式转换。intintint

只需在程序中将 s 切换intlongs ,它就会按预期运行:

int noofcases = int.Parse(Console.ReadLine());
for (int i = 0; i < noofcases; i++)
{
    long number = int.Parse(Console.ReadLine());
    long result = -1;
    long a, b, c;
    for (a = 1; a <= number / 3; a++)
    {
        b = (((number * number) - (2 * a * number)) / ((2 * number) - (2 * a)));
        c = number - a - b;
        if ((a * a) + (b * b) == (c * c))
        {
            result = (a * b * c);
        }
    }
    Console.WriteLine(result);
}

输出:

1
5040
4445280000

推荐阅读