zoukankan      html  css  js  c++  java
  • 【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;
    }
    


     

  • 相关阅读:
    结合源码浅析Struts2与Spring整合的原理
    LINUX centOS6.x下安装redis
    基于Spring注解@cacheable 集成redis
    windows下搭建LDAP并利用Java实现对LDAP的操作
    Java利用freemaker和(excelXML表格或wordXML表格),导出自己任何想要格式的文档
    创建oracle表的时候一个小细节,会导致你处理java类型转换是时候很麻烦
    socketlog的安装和使用
    Windows 定时任务对数据库进行操作
    将博客搬至CSDN
    git+gitlab实现git版本控制管理本地化+自动化部署
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632465.html
Copyright © 2011-2022 走看看