题目类型 数学
题目意思
对于方程 A1*x + B1*y + C1 = 0 和 A2*x + B2*y + C2 = 0 决定的两个点集的交集的元素数量是多少
所有参数均为整数, 取值满足区间 -> [-100,100]
解题方法
方法很多
例如可以先变换下方程 A1x+B1y+C1=0 -> y = -A1/B1 - C1/B1 然后代入方程 A2x+B2y+C2=0 中
则 (A2-A1*B2/B1)x + C2-C1*B2/B1 = 0, 即求这个方程的解有多少个(注意这个方程只有当 B1 != 0 时才有意义)
所以如果 B1 == 0 && B2 == 0时要特判下,见参考代码
参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int main() { int a1, b1, c1, a2, b2, c2; while(scanf("%d%d%d", &a1, &b1, &c1) != EOF) { scanf("%d%d%d", &a2, &b2, &c2); if( (a1 == 0 && b1 == 0 && c1) || (a2 == 0 && b2 == 0 && c2) ) { printf("0\n"); continue; } if(b1 == 0 && b2 == 0) { if(a1 == 0 || a2 == 0) printf("-1\n"); else { double t1 = -c1*1.0/a1; double t2 = -c2*1.0/a2; if(fabs(t1-t2) <1e-12) printf("-1\n"); else printf("0\n"); } continue; } else if(b1) { double A = a2 - a1*b2*1.0/b1; double B = c2 - c1*b2*1.0/b1; //printf("%lf %lf\n", A, C); if(fabs(A)<1e-12 && fabs(B)<1e-12) printf("-1\n"); else { if(fabs(A)<1e-12) printf("0\n"); else printf("1\n"); } } else if(b2) { double A = a1 - a2*b1*1.0/b2; double B = c1 - c2*b1*1.0/b2; //printf("%lf %lf\n", A, C); if(fabs(A)<1e-12 && fabs(B)<1e-12) printf("-1\n"); else { if(fabs(A)<1e-12) printf("0\n"); else printf("1\n"); } } } return 0; }