c# - 无法从三元组的总和计算毕达哥拉斯三元组的正确乘积
问题描述
毕达哥拉斯三元组是一组三个自然数,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# 中的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 ,除非您使用显式转换。int
int
int
只需在程序中将 s 切换int
为long
s ,它就会按预期运行:
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
推荐阅读
- c++ - 是否允许从 CppCon 示例中进行这些编译器优化?
- spring-mvc - 如何找到招摇的路径
- python - 无法理解 Django save() 如何处理 *args
- apache - 添加别名时Apache找不到index.html
- selenium - 当我使用 webdriver 时,selenium 工作正常,但我在任何地方都找不到 geckodriver 可执行文件
- c - 在 c 中定义函数和打印
- java - 多线程中的休眠异常 - 事务未成功启动
- c++ - 有效地从 32 位数据类型中删除 2 位
- c# - 将列表对象序列化为 XML 值异常:反映类型“..Otrx”时出现错误
- android - 将图像而不是字符串标题添加到 react-native-segmented-control-tab