PAT-B 1051 複數乘法

Enjoy_process發表於2019-02-24

                                             PAT-B 1051 複數乘法

                       https://pintia.cn/problem-sets/994805260223102976/problems/994805274496319488

 

 

題目

複數可以寫成 (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

分析

問題比較簡單,但是有一個坑需要注意,由於實部、虛部都要保留兩位小數,那麼大家想想如果A的值在(-0.005,0)區間內時,應該輸出什麼,負數的四捨五入和正數的四捨五入的效果恰好反過來了,負數舍了變大了,入了卻變小了,比如x=-0.005,四捨五入一下x=-0.01,入後變小了。如果A在(-0.005,0)之間那麼A捨去後等於0.00,然而計算機的輸出是什麼呢?

輸出是-0.00,問題就出在負號上,我們需要把負號去掉,只輸出0.00。

C++程式

#include<iostream>
#include<cmath>

using namespace std;

int main()
{
	double r1,p1,r2,p2;
	scanf("%lf%lf%lf%lf",&r1,&p1,&r2,&p2);
	double a=r1*cos(p1),b=r1*sin(p1),c=r2*cos(p2),d=r2*sin(p2);
	double A=a*c-b*d,B=a*d+b*c;//(a+bi)*(c+di)=(ac-bd)+(ad+bc)i
	if(-0.005<A&&A<0) A=0;//防止輸出-0.00的情況 
	if(-0.005<B&&B<0) B=0;
	printf("%.2lf",A);
	if(B>=0) putchar('+');
	printf("%.2lfi\n",B);
	return 0; 
}

 

相關文章