题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805274496319488
利用到数学知识:复数可以用极坐标方式表示,当用极坐标方式表示时,
写成极坐标下的指数形式 (R×e(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位,其等价于三角形式 (R(cos(P)+isin(P))。
在极坐标情况下,求两复数的积,公式:Rs=R1*R2*cos(P1+P2),Ps=R1*P2*sin(P1+P2),
关于极坐标下的复数乘积,在电路分析,电工电子中均以考题形式出现过(很简单的,)
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
double R_1,P_1,R_2,P_2;
scanf("%lf%lf%lf%lf",&R_1,&P_1,&R_2,&P_2);
double R_S=0,P_S=0;
R_S=R_1*R_2*cos(P_1+P_2);
P_S=R_1*R_2*sin(P_1+P_2);
if(R_S>-0.05&&R_S<0){//为什么不判断实部小于0.05,且大于0的情况??
//因为题目说要保留两位小数,>0.005时,会自动进位,0.01,所以,
//接下来都是实部与虚部与0.005的关系作为判断条件
//为什么只在-0.005和0之间做判断,当数字大于-0.005时,如果不判断的话,会输出-0.00,所以要特殊判断
printf("0.00");
}
else
printf("%.2lf",R_S);
if(P_S>0){
printf("+%.2lfi",P_S);
}
else if(P_S<0&&P_S>-0.05){//小数限制
//为什么不判断虚部小于0.05,且大于0的情况
printf("+0.00i");
}
else{
printf("%.2lfi",P_S);
}
return 0;
}
二刷:关键在于0的判断,因为是小数,小数与某个整数大小比较是否相等,应该是判断abs(x) <= 0.000001, 但在这里与0判断的话,要求我们保留2位小数,我们认为abs(x)<=0.001就可以。
另外,数据元素应该用float型,而非double型,因为:float精确到小数点后6-7位,double精确到小数点之后14-15位。
#include<stdio.h>
#include<math.h>
int main()
{
freopen("D://input.txt", "r", stdin);
double r1, p1, r2, p2;
scanf("%lf %lf %lf %lf", &r1, &p1, &r2, &p2);
double A = r1*r2*cos(p1)*cos(p2) - r1*r2*sin(p1)*sin(p2);
double B = r1*r2*cos(p1)*sin(p2) + r1*r2*sin(p1)*cos(p2);
if(fabs(A) <= 0.001)
printf("0.00");
else
printf("%.2f", A);
if(B >= 0)
printf("+%.2lfi", B);
else if(fabs(B) <= 0.001)
printf("+0.00i");
else
printf("%.2lfi", B);
return 0;
}