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;

}

 

 
posted @ 2019-04-15 19:49  知道了呀~  阅读(233)  评论(0编辑  收藏  举报