J: Just for fun
J: Just for fun
时间限制: 1 s 内存限制: 128 MB
题目描述
最近carryon在准备考研复习高数,复习到微分学的时候看到一个求曲面某点的切平面的问题。
现在有一个曲面方程如下:
AX^2 + BY^2 + CZ^2 = D
给一个在曲面上的点(x, y, z);
然后你需要计算出切面方程,并且输出;
a,b,c,d分别为他们的系数
(保证结果一定存在)
输出的格式如:(系数为零的不输出)
ax + by + cz + d = 0
输出规定最前面的未知数的参数为正数;
输入
题目要求多组输入!!!
第一行输入四个参数,A, B, C, D;(-10000 <A,B,C,D<10000, 且都不为零);
第二行输入三个参数,x, y, z;(-100 < x,y,z < 100);
输出
ax + by + cz + d = 0
样例输入
1 1 1 14
1 2 3
样例输出
x + 2y + 3z - 14 = 0
高数:解切面方程
1、先求出切面方程的法向量(2ax0,2by0,2cz0);
2、用点法式表示切面方程:2ax0(x-x0)+2by0(y-y0)+2cz0(z-z0)=0
注意几点要求:
1、第一个未知数系数一定为正
2、系数为零的不输出
3、系数为-1和1的未知数不输出1
#include<iostream> #include<math.h> #define ll long long using namespace std; ll a, b, c, d, x, y, z,A, B, C, temp; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); } void check() { if(A==0) { if(B==0) { if(C<0) C=C*-1,d=d*-1; } if(B<0) B=B*-1,C=C*-1,d=d*-1; } if(A<0) A=A*-1,B=B*-1,C=C*-1,d=d*-1; } int main() { while (~scanf("%lld%lld%lld%lld", &a, &b, &c, &d)) { scanf("%lld%lld%lld", &x, &y, &z); //ll A, B, C, temp; A = 2 * x*a, B = 2 * y*b, C = 2 * z*c; d = A * x*-1 + B * y*-1 + C * z*-1; //A = 2 * x*a, B = 2 * y*b, C = 2 * z*c; temp = gcd(gcd(A, B), gcd(C, d)); A = A / temp, B = B / temp, C = C / temp, d = d / temp; check(); if(A!=0&&A!=1&&A!=-1) cout<<A<<'x'; if(A==1) cout<<'x'; if(A==-1) cout<<"-x"; if(B>0&&B!=1&&B!=-1) cout<<" + "<<B<<'y'; if(B<0&&B!=1&&B!=-1) cout<<" - "<<-1*B<<'y'; if(B==1) cout<<'y'; if(B==-1) cout<<"-y"; if(C>0&&C!=1&&C!=-1) cout<<" + "<<C<<'z'; if(C<0&&C!=1&&C!=-1) cout<<" - "<<-1*C<<'z'; if(C==1) cout<<'z'; if(C==-1) cout<<"-z"; if(d<0) cout<<" - "<<-1*d; if(d>0) cout<<" + "<<d; cout<<" = 0"<<endl; } return 0; }
等风起的那一天,我已准备好一切