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