您的位置:首页 > 其它

【2039】复数四则运算

2017-10-06 19:23 169 查看

Time Limit: 1 second
Memory Limit: 50 MB

【问题描述】

    输入两个复数和一个运算符,计算后将结果以复数形式输出,计算结果均保留两位小数。(注意:求除法时,除数的实部与虚部若同时为0,则输出'error!')。
    说明:复数的一般形式为,一个复数X=A+Bi,其中A、B就是它的实部和虚部,字母i不可少。A、B同为实数,若B=0,则X为一个普通的实数。当A=0或B=0时就省略掉实部或虚部,包括中间的加号,同时约定i*i=-1。
    设有两个复数X=A+Bi,Y=C+Di,则他们的四则运算规则如下:
    1)加法:Z=X+Y=(A+C)+(B+D)i;
    2)减法:Z=X+Y=(A-C)+(B-D)i;
    3)乘法:按照多项式运算法则进行:Z=X*Y=(A*C-B*D)+(A*D+B*C)i;
    4)除法:先将分母实数化,再合并同类项形成新的附属的实部和虚部:Z=X/Y=(A*C+B*D)/(C*C+D*D)+(B*C-A*D)i/(C*C+D*D);
    注意:本题中的数据默认在实数范围有效,不考虑溢出问题。

【输入】

    共2行;
    第一行依次输入两个复数的实部和虚部,共4个实数,中间间隔一个空格。
    第二行输入一个运算符号(+、-、*、/ 之一)。

【输出】

    包含1行,结果为复数形式:a+bi。

【输入样例1】

2 3 6 11
+

【输出样例1】

8.00+14.00i

【输入样例2】

0 54 5 0
/

【输出样例2】

10.80i
 

【题解】

只要按照题目的要求运算就可以了。公式也都给出来了——>有学复数的可以自己写。除法就是把分母常数化。。高中我经常叫成分子常数化。。

比较坑的是,里面有一个点输出为0,而0没有保留两位数字。。。我一开始还以为是因为符号多打了几个字符,所以才没过。后来改成判断字符的

【代码】

#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <string>

using namespace std;

double A,B,C,D,E,F;
string s1;

void input_data()
{
scanf("%lf %lf %lf %lf",&A,&B,&C,&D);
cin >> s1;
}

void get_ans() //根据符号 做相应的运算
{
if (s1[0] == '+')
{
E = A + C;
F = B + D;
}
if (s1[0] == '-')
{
E = A - C;
F = B - D;
}
if (s1[0] == '*')
{
E = A*C - B*D;
F = A*D + B*C;
}
if (s1[0] == '/')
{
double x = C-0;
double y = D-0;
if (x < 0) x = -x;
if (y < 0) y = -y;
if ( (x < 0.00001) && (y < 0.000001)) //这里我没有直接用== 而是用 相差趋近于0来判断相同。保险点
{
printf("error!");
exit(0);
}
E = (A * C + B * D)/(C * C + D * D);
F = (B*C-A*D)/(C*C+D*D);
}
}

void output_ans()
{
if (F == 0) //最后的输出要注意点
{
if (E == 0)
printf("0");
else
printf("%.2lf",E);

return;
}
if (E == 0 && F != 0)
{
printf("%.2lfi",F);
return;
}
printf("%.2lf+%.2lfi",E,F);
}

int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}


 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: