无法从三元组的总和计算毕达哥拉斯三联体的正确乘积

时间:2018-12-29 19:58:29

标签: c#

毕达哥拉斯三联体是一组三个自然数,a
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);
}

1 个答案:

答案 0 :(得分:1)

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

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

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

因此,随着您的体验,4,445,280,000将变为150,312,704。

仅将long用于结果 将不起作用,因为任何int乘以int的输出将始终是{{1 }},除非您使用显式强制转换。

只需将您的int切换到程序中的int,它就会按预期运行:

long

输出:

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);
}