PAT Basic 1051. 复数乘法
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;
}