【2039】复数四则运算

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


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值