• 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;
    
    }
     
  • 相关阅读:
    前端 JS+CSS
    Git 命令行操作
    信息安全 学习笔记(2)——防火墙(Netfilter/ IPtables)
    信息安全 学习笔记(3)—— 后门(Backdoor+rootkit)
    Linux课程学习总结报告
    信息安全 学习笔记(4)—— 【问答题 复习纲要】
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    centos安装和卸载软件
    zookeeper错误KeeperErrorCode = ConnectionLoss解决
    查看linux信息
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10712651.html
Copyright © 2020-2023  润新知