PAT乙级B1051 复数乘法 (15 分)

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

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

输入格式:

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

输出格式:

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

输入样例:

2.3 3.5 5.2 0.4

输出样例:

-8.68-8.23i

题意:给出两个复数,让你求它们的乘积结果保留3位小数。注意给出的为指数形式而结果要写成常规形式。

思路: c++中保留小数点满足“四舍六入五成双”规则,

“四舍六入五成双”规则如下:

“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上。"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:5前为奇数,舍5入1;5前为偶数,舍5不进(0是偶数)。

即保留的最后一位如果是奇数就进一,否则舍弃,例如:1.2335,1.2345保留三位小数均为1.234.最终的答案也应满足这一规则,而不是我们常说的“四舍五入”规则。注意:负数在零附近要单独判断输出。但我的vs2010步兵满足上述规则,有时候符合有时候不符合,搞不懂!!!

参考代码:

#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	double r1,p1,r2,p2,r,p;
	scanf("%lf%lf%lf%lf",&r1,&p1,&r2,&p2);
	r1*=r2;
	p1+=p2;
	r=r1*cos(p1);
	p=r1*sin(p1);
	if(r+0.005>=0&&r<0)    //0附近负数单独判断
		printf("0.00");
	else printf("%.2f",r);
	if(p>=0) printf("+%.2fi\n",p);
	else if(p+0.005>=0&&p<0)        //0附近负数单独判断
		printf("+0.00i");    
	else printf("%.2fi\n",p);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/vir_lee/article/details/88088866