本题要求编写程序,计算2个复数的和、差、积、商。
输入格式:
输入在一行中按照a1 b1 a2 b2
的格式给出2个复数C1=a1+b1i
和C2=a2+b2i
的实部和虚部。题目保证C2不为0。
输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果
的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
输入样例1:
2 3.08 -2.04 5.06
输出样例1:
(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
输入样例2:
1 1 -1 -1.01
输出样例2:
(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0
``
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//虚数结构体
struct imaginaryNum
{
double a;
double b;
};
typedef struct imaginaryNum cnum;
cnum* addition(cnum* c1,cnum* c2);//虚数加法
cnum* subtraction(cnum* c1,cnum* c2);//虚数减法
cnum* multiplication(cnum* c1,cnum* c2);//虚数乘法
cnum* division(cnum* c1,cnum* c2);//虚数除法
*/
//(2.0+3.1i) + (-2.0+5.1i) = 8.1i
int main(void)
{
int ii=0;
cnum c1,c2;
memset(&c1,0,sizeof(c1));
memset(&c2,0,sizeof(c2));
cnum* c3=NULL;
scanf("%lf %lf %lf %lf",&c1.a,&c1.b,&c2.a,&c2.b);//输入虚数
for(ii=0;ii<4;ii++)
{
//打印 算式
printf("(%.1lf",c1.a);
if(c1.b<0)printf("");else printf("+");
printf("%.1lfi)",c1.b);
//给出 运算符号,顺便利用 已有的函数 运算
switch(ii)
{
case 0:{printf(" + ");c3=addition(&c1,&c2);};break;
case 1:{printf(" - ");c3=subtraction(&c1,&c2);};break;
case 2:{printf(" * ");c3=multiplication(&c1,&c2);};break;
case 3:{printf(" / ");c3=division(&c1,&c2);};break;
}
printf("(%.1lf",c2.a);
if(c2.b<0)printf("");else printf("+");
printf("%.1lfi)",c2.b);
printf(" = ");
if(c3->a>(0-0.1)&&c3->a<(0+0.1)&&c3->b>(0-0.1)&&c3->b<(0+0.1))printf("0.0");
else if(!(c3->a>(0-0.1)&&c3->a<(0+0.1)||c3->b>(0-0.1)&&c3->b<(0+0.1)))
{
printf("%.1lf",c3->a);
if(c3->b<0)printf("");else printf("+");
printf("%.1lfi",c3->b);
}
else
{
if(!(c3->a>(0-0.1)&&c3->a<(0+0.1)))printf("%.1lf",c3->a);
else printf("%.1lfi",c3->b);
}
printf("\n");
}
return 0;
}
//下面是构造的虚数运算函数
cnum* addition(cnum* c1,cnum* c2)
{
cnum* c3=(cnum*)malloc(sizeof(cnum));
c3->a=c1->a+c2->a;
c3->b=c1->b+c2->b;
return c3;
}
cnum* subtraction(cnum* c1,cnum* c2)
{
cnum* c3=(cnum*)malloc(sizeof(cnum));
c3->a=c1->a-c2->a;
c3->b=c1->b-c2->b;
return c3;
}
cnum* multiplication(cnum* c1,cnum* c2)
{
cnum* c3=(cnum*)malloc(sizeof(cnum));
c3->a=c1->a*c2->a - c1->b*c2->b;
c3->b=c1->a*c2->b + c1->b*c2->a;
return c3;
}
cnum* division(cnum* c1,cnum* c2)
{
cnum* c3=(cnum*)malloc(sizeof(cnum));
c3->a=c1->a*c2->a + c1->b*c2->b;
c3->b=-c1->a*c2->b + c1->b*c2->a;
c3->a=c3->a/(c2->a*c2->a+c2->b*c2->b);
c3->b=c3->b/(c2->a*c2->a+c2->b*c2->b);
return c3;
}
特别注意,题目要求中
如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。
这个步骤涉及到浮点数的比较大小的问题,我最开始是直接用==0来处理,但是提交上去一直显示错误,后来想起来浮点数不能直接比较大小,就让 c3->a在 -0.01 到 +0.01的范围内就认为是0 了(因为 结果精度为0.1),但是还不对,最后调整到(+0.1~0.1)认为是0,终于提交正确
这个题给我的教训是,再次强调了 “浮点数不能直接比较大小这个知识点”