有一个三角形,它的斜边长度给我们。现在我们的任务是找出其他两边是否也是整数。
对于上面的问题,我构建了一个代码,但效率很低,你能为它建议任何有效的算法。
我的工作
#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;
}
答案 0 :(得分:0)
如果我理解正确,你试图回答“是否存在带有连字符S的整数大小的直角三角形?”。
立即改进您的方法:
您可以使用此替代整数变体,而不是检查整数平方根(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
(见评论,我不允许发布足够的链接)