PAT Basic 1051. 复数乘法

发布时间 2023-03-25 13:26:08作者: 十豆加日月

PAT Basic 1051. 复数乘法

1. 题目描述:

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

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

2. 输入格式:

输入在一行中依次给出两个复数的 \(R1\)\(P1\)\(R2\)\(P2\),数字间以空格分隔。

3. 输出格式:

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

4. 输入样例:

2.3 3.5 5.2 0.4

5. 输出样例:

-8.68-8.23i

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

本以为是除草题,会复数乘法规则就能AC,结果第一次提交只过了一个测试点,testpoint1,2,3都报wrong answer。。。

检查了下发现当虚部\(B\)为正数时我没有输出"+",改过来后(注释掉的代码部分)testpoint2,3依然报错。检查了逻辑感觉没问题,无奈只能参考大佬题解:PAT-Basic-1051. 复数乘法 – Lnyan's Blog (llonely.com) 和https://blog.csdn.net/liuchuo/article/details/51994291

这里的主要bug点就是最后结果保留2位小数时,一些接近0的负数在四舍五入后会输出-0.00,不符合计算机存储规则(只有+0,没有-0?虽然我感觉输出-0.00逻辑上没问题,只是跟测试用例不符罢了。。。),所以需要额外判断下,都输出0.00+0.00,改过来后AC。

My Code:

// #include <stdio.h>
// #include <math.h> // sin cos header

// // first submit testpoint1, 2, 3 wrong answer
// int main(void)
// {
//     double r1=0, p1=0, r2=0, p2=0;
//     double resRe=0, resIm = 0;
    
//     scanf("%lf%lf%lf%lf", &r1, &p1, &r2, &p2);
//     resRe = r1*r2*cos(p1+p2);
//     resIm = r1*r2*sin(p1+p2);
    
// //     if(resRe < 0)
// //     {
// //         if(resIm<0)
// //             printf("%.2lf%.2lfi\n", resRe, resIm);
// //         else // to print + when Im part > 0, after this debug, testpoint1 accepted, 2, 3 still wrong answer
// //             printf("%.2lf+%.2lfi\n", resRe, resIm);
// //     }
// //     else
// //     {
//         if(resIm<0)
//             printf("%.2lf%.2lfi\n", resRe, resIm);
//         else// to print + when Im part > 0, after this debug, testpoint1 accepted, 2, 3 still wrong answer
//             printf("%.2lf+%.2lfi\n", resRe, resIm);
// //     }
    
//     return 0;
// }

#include <stdio.h>
#include <math.h> // sin cos header
int main(void)
{
    double r1=0, p1=0, r2=0, p2=0;
    double resRe=0, resIm = 0;
    
    scanf("%lf%lf%lf%lf", &r1, &p1, &r2, &p2);
    resRe = r1*r2*cos(p1+p2);
    resIm = r1*r2*sin(p1+p2);
    
    if(resRe+0.005>0 && resRe<0)
        printf("0.00");
    else
        printf("%.2lf", resRe);
    
    if(resIm+0.005>0 && resIm<0)
        printf("+0.00i\n");
    else if(resIm<0)
        printf("%.2lfi\n", resIm);
    else
        printf("+%.2lfi\n", resIm);
    
//     // LNYAN' solution, actually still have bug, for -0.009, the answer should be -0.01.
//     if(resRe > -1e-2)
//         printf("%.2lf", fabs(resRe));
//     else
//         printf("-%.2lf", fabs(resRe));
    
//     if(resIm > -1e-2)
//         printf("+%.2lfi\n", fabs(resIm));
//     else
//         printf("-%.2lfi\n", fabs(resIm));
    
    return 0;
}