基本思路:因为要构成直角三角形都必须是整数坐标,
所以首先需要判断,给定的2条直角边是否可以用平行
于x轴和y轴的整数线段构成以这条直角边为斜边的直
角三角形。然后这里的代码是把(0, 0) 当作公共点输出
的,所以就剩下求4种情况的分析了,具体看代码。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; struct Point{ int x, y; }; int squa[1000005]; //求1-1000的平方,标记 void init() { memset(squa, 0, sizeof(squa)); for(int i = 0; i < 1001; i ++) squa[i*i] = 1; } int main() { int a, b; scanf("%d%d", &a, &b); init(); //以(0, 0)作为直角三角形直角的公共点 bool flag1 = false; //判断直角边a能否成为平行于X, Y轴整数直角边的斜边 bool flag2 = false; //判断直角边b, 同上 Point pt1[100]; //保存直角边a所有的可能作为斜边时的坐标点 Point pt2[100]; //保存直角边b, 同上 int n1 = 0; //pt1的个数 int n2 = 0; //pt2的个数 //求所有构成直角边a为斜边的坐标 for(int i = 1; i < a; i ++) if(squa[a*a - i*i]) { pt1[n1].x = i; pt1[n1++].y = sqrt(a*a - i*i); flag1 = true; } //求所有构成直角边b为斜边的坐标 for(int i = 1; i < b; i ++) if(squa[b*b - i*i]) { flag2 = true; pt2[n2].x = i; pt2[n2++].y = sqrt(b*b - i*i); } //如果都可以作为斜边,有可能存在解 if(flag1 && flag2){ do{ bool flag = false; for(int i = 0; i < n1; i ++) for(int j = 0; j < n2; j ++){ //分成4种情况判断, 比如假设给定5,5 //那么2个求出的都是(3, 4),注意(0, 0)一定是其中一个点 //但是(4, 3)也是其中的情况,还有二者必须在相邻象限 //同时可能存在求出的x相等或者y相等,这样就会导致平行坐标轴,所以第三第四种情况是讨论这些 int c = (pt1[i].x-pt2[j].x)*(pt1[i].x-pt2[j].x) + (pt1[i].y+pt2[j].y)*(pt1[i].y+pt2[j].y); if(a * a + b * b == c){ printf("YES\n"); printf("0 0\n"); if(pt1[i].x != pt2[j].x) { printf("%d %d\n", pt1[i].x, pt1[i].y); printf("%d -%d\n", pt2[j].x, pt2[j].y); } else{ printf("-%d %d\n", pt1[i].x, pt1[i].y); printf("%d %d\n", pt2[j].x, pt2[j].y); } goto L; break; } int c1 = (pt1[i].x-pt2[j].y)*(pt1[i].x-pt2[j].y) + (pt1[i].y+pt2[j].x)*(pt1[i].y+pt2[j].x); if(a * a + b * b == c1){ printf("YES\n"); printf("0 0\n"); if(pt1[i].x != pt2[j].y){ printf("%d %d\n", pt1[i].x, pt1[i].y); printf("%d -%d\n", pt2[j].y, pt2[j].x); } else{ printf("-%d %d\n", pt1[i].x, pt1[i].y); printf("%d %d\n", pt2[j].y, pt2[j].x); } goto L; break; } int c2 = (pt1[i].x+pt2[j].x)*(pt1[i].x+pt2[j].x) + (pt1[i].y-pt2[j].y)*(pt1[i].y-pt2[j].y); if(a * a + b * b == c2){ printf("YES\n"); printf("0 0\n"); if(pt1[i].y != pt2[j].y) { printf("%d %d\n", pt1[i].x, pt1[i].y); printf("-%d %d\n", pt2[j].x, pt2[j].y); } else{ printf("%d -%d\n", pt1[i].x, pt1[i].y); printf("%d %d\n", pt2[j].x, pt2[j].y); } goto L; break; } int c3 = (pt1[i].x+pt2[j].y)*(pt1[i].x+pt2[j].y) + (pt1[i].y-pt2[j].x)*(pt1[i].y-pt2[j].x); if(a * a + b * b == c3){ printf("YES\n"); printf("0 0\n"); if(pt1[i].y != pt2[j].x){ printf("%d %d\n", pt1[i].x, pt1[i].y); printf("-%d %d\n", pt2[j].y, pt2[j].x); } else{ printf("%d -%d\n", pt1[i].x, pt1[i].y); printf("%d %d\n", pt2[j].y, pt2[j].x); } goto L; break; } } printf("NO\n"); break; }while(1); } else{ printf("NO\n"); } L: return 0; }