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;
}