给出一边时找到三角形的其他两边的算法

时间:2013-10-17 08:16:48

标签: algorithm geometry discrete-mathematics

有一个三角形,它的斜边长度给我们。现在我们的任务是找出其他两边是否也是整数。

对于上面的问题,我构建了一个代码,但效率很低,你能为它建议任何有效的算法。

我的工作

#include<stdio.h>
#include<cmath>

using namespace std;

int isInt(double x) {
    if( (x - (int)x) == 0 ) return 1;
    return 0;
}

main() {
    int S;
    int flag = 0;

    scanf("%d", &S);
    flag = 0;
    for(int i = 1; i < S; i++) {
       if( isInt(sqrt(S*S - i*i)) ) {
           printf("EXIST\n");
           flag = 1;
           break;
        }
    }
    if(!flag) printf("NOT EXIST\n");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你试图回答“是否存在带有连字符S的整数大小的直角三角形?”。

立即改进您的方法:

  • 将i从1循环到S / 2而不是1到S-1。
    • 实际上,S / 2本身也不是必需的,因为这意味着a == b,因此c必须包含奇数个sqrt(2)因子。
  • (无需将flag = 0设置两次。)

您可以使用此替代整数变体,而不是检查整数平方根(sqrt操作非常耗时):

int check(int c){
  int a=1;
  int b=c-1;
  int cc=c*c;
  while(a<b){
    int sum=a*a+b*b;
    if(sum==cc) return true;
    if(sum<cc){
      a++;
    }else{
      b--;
    }
  }
  return false;
}

(代码未经过测试。)

还有其他方法可以回答涉及可表达性定理的问题,即应用于给定连字符的平方的两个方格的总和。然而,这些通常涉及因子分解,这也是一个难题。

(编辑:删除了关于分解复杂性的错误陈述)

更多信息:

http://en.wikipedia.org/wiki/Pythagorean_triple http://en.wikipedia.org/wiki/Fermat“s_theorem_on_sums_of_two_squares

(见评论,我不允许发布足够的链接)