• PTA 1051 复数乘法


    复数乘法   

    复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i2=1;也可以写成极坐标下的指数形式 (R×e(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位,其等价于三角形式 R(cos(P)+isin(P))。

    现给定两个复数的 R 和 P,要求输出两数乘积的常规形式。

    输入格式:

    输入在一行中依次给出两个复数的 R1P1R2P2,数字间以空格分隔。

    输出格式:

    在一行中按照 A+Bi 的格式输出两数乘积的常规形式,实部和虚部均保留 2 位小数。注意:如果 B 是负数,则应该写成 A-|B|i 的形式。

    输入样例:

    2.3 3.5 5.2 0.4
    
     

    输出样例:

    -8.68-8.23i

    ---------------------------

    根据题目要求,给出的是两个复数的极坐标形式。要求计算其加法,并且转化为直角坐标的形式。题目本身不难,引入math,h就可以直接做出来。但是这道题存在着容易被忽视的地方:如果简单写一个程序,第4项答案错误。因为数据可能存在这样的一种情况:极坐标转化为直角坐标后,A或者B小于0.005,因为题目要求只保留两位,所以这里输出会变成0.00,但是负号还会保留着,导致输出变成-0.00,这是不合题意的。并且给出数据位数较多,float是32位长度,尾数部分23位,可能会不够用,因此需要使用double来存储数据。

     以下为正确代码,其关键点在于使用double而不是float型,并且要对绝对值小于0.005的数据进行单独处理 。

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        double r1,r2,p1,p2;
        double r,p,a,b;
        scanf("%lf %lf %lf %lf",&r1,&p1,&r2,&p2);
        r=r1*r2;
        p=p1+p2;
        a=r*cos(p);
        b=r*sin(p);
        if(fabs(a)<0.005)       a=0.00;  //绝对值小于0.005时就要强制变成正0
        if(fabs(b)<0.005)       b=0.00;
        printf("%.2f",a);
        
        if(b>=0) printf("+");          //b小于0不用管,大于0时需要额外加一个+号
        printf("%.2lfi",b);
        return 0;
    }
  • 相关阅读:
    工具函数(代码块的大小,代码块起始地址,提升进程权限)
    在共享DLL中使用MFC 和在静态库中使用MFC的区别
    虚拟机检测绕过总结--不定时更新
    OSGI原形(.NET)
    iOS开发技术分享(1)— iOS本地数据存储
    将JSON映射为实体对象(iOS篇)
    灵活的路由(上)
    github开源项目
    EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态
    实体能否处于非法状态
  • 原文地址:https://www.cnblogs.com/namezhyp/p/15829934.html
Copyright © 2020-2023  润新知