java - 确定给定数字 N 是否可以成为具有所有 3 个整数边的直角三角形的斜边的算法

标签 java c++ c algorithm geometry

假设给定一个直角三角形的斜边,那么如何确定给定的斜边是否可能存在两条整数较小的边。

例如,给定斜边为 5。然后您必须确定给定直角三角形的整数边是否更小。答案将是,因为我们可以有更小的边为 3和 4,因此得到一个 3-4-5 直角三角形。

类似地,对于像 7 这样的斜边,我们不能有这样的直角三角形。

换句话说,我们要找出一个给定的数 N 是否可以作为 3 边均为整数的直角三角形的斜边。

我浏览了关于 Pythagorean triples 的整篇文章但仍然没有成功。我很困惑要检查什么条件。请帮忙。

最佳答案

你有一个原始毕达哥拉斯三元组:

(p^2 - q^2)^2 + (2 * p * q))^2 = (p^2 + q^2)^2 = N^2

假设 p >= q。那么我们有

N >= 2 * q^2 or q <= sqrt(N / 2)

假设 N = 13,那么我们需要 q <= sqrt(13/2) = 2.54

q = 2 => p^2 = 13 - 4 = 9,这是一个正方形。

因此,您可以从 1..sqrt(N/2) 得到一个数字“i”的小循环,并检查 N - (i^2) 是否为正方形。

对于 原始 毕达哥拉斯元组的成员,这将是 O(sqrt(N))

C/C++ 示例代码:

#include <stdio.h>
#include <math.h>

void CheckTuple(int n)
{
    int k = sqrt(n/2.0);

    for (int i = 1; i <= k; i++) {
        int tmp = sqrt((double)(n - i * i));
        if ((tmp * tmp) == (n - i * i)) {
            printf("%d^2 + %d^2 = %d^2\n", (tmp*tmp - i*i), 2 * tmp * i, n);
            return;
        }
    }
    printf("%d is not part of a tuple\n", n);
    return;
}


int main(int argc, char *argv[])
{

    CheckTuple(5);
    CheckTuple(6);
    CheckTuple(13);
    CheckTuple(10);
    CheckTuple(25);

    return 0;
}

输出:

3^2 + 4^2 = 5^2
6 is not part of a tuple
5^2 + 12^2 = 13^2
8^2 + 6^2 = 10^2
7^2 + 24^2 = 25^2

关于java - 确定给定数字 N 是否可以成为具有所有 3 个整数边的直角三角形的斜边的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19332978/

相关文章:

java - 看不懂Java普通类库的用法

c++ - 为什么编译器不为返回类型为 classname& 的函数返回 this 指针而抛出错误

条件跳转或移动取决于未初始化的值 - 释放链表

java - 从科学记数法转换 double

java - Spring boot JPA + MySQL 抛出错误

java - 将 'new'放入put方法中,还是使用中间变量,效率更高吗?

c++ - 如何使用 OO 在 C++ 中为 kdtree 实现一组键

c - 如何在c中从1阶段for循环创建2阶段for循环语句?

c - 在 C 中读取以前未知大小的矩阵

java - 如何告诉 JRE 使用多个 CPU 节点