Algorithm 当一个边给定时,找到一个试验的另两个边的算法

Algorithm 当一个边给定时,找到一个试验的另两个边的算法,algorithm,geometry,discrete-mathematics,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

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

对于上面的问题,我构建了一个代码,但这是低效的,您能为同样的问题建议任何有效的算法吗

我的工作

#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;
}
#包括
#包括
使用名称空间std;
int isInt(双x){
如果((x-(int)x)==0)返回1;
返回0;
}
main(){
int-S;
int标志=0;
scanf(“%d”和“&S”);
flag=0;
对于(int i=1;i
如果我理解正确,您是在试图回答“是否存在一个带有假设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;
}
int检查(int c){
INTA=1;
int b=c-1;
int cc=c*c;
而