复数四则运算-----一个小坑啊!!
7-36 复数四则运算(15 分)
本题要求编写程序,计算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
这道题有点坑,首先是浮点数如何判断是不是零,然后网上找了一个代码
1 fabs(a) < 1e-6 //float
fabs(f) <= 1e-15 //double
但是这个还是过不了,后来我就试了一下
1 printf("%f %f\n",a,b);
发现 1.0 - 1.0 =0.01了,这就难怪之前过不了,然后我再改了一下判断
fabs(a) < 0.1
#include<stdio.h> #include<stdlib.h> #include<math.h> #include <string.h> /* 7-36 复数四则运算(15 分) 本题要求编写程序,计算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。 */ void print1( float a,float b); void print2(float a,float b,float c,float d); void print3(float a,float b,float c,float d); void print4(float a,float b,float c,float d); void print5(float a,float b,float c,float d); int main() { float a,b,c,d; scanf("%f %f %f %f",&a,&b,&c,&d); //加法 float f = a+c; float g = b+d; //- float h = a-c; float i = b-d; //* float j = a*c-b*d; float k = b*c+a*d; //chu float l = (a*c+b*d)/(c*c+d*d); float m = (b*c-a*d)/(c*c+d*d); print2(a,b,c,d); print1(f,g); print3(a,b,c,d); print1(h,i); print4(a,b,c,d); print1(j,k); print5(a,b,c,d); print1(l,m); return 0; } void print1( float a,float b) { // printf("%f %f\n",a,b); if ( fabs(a) < 0.1 && fabs(b) < 0.1){ printf("0.0\n"); } else if( fabs(a) < 0.1 ){ printf("%.1fi\n",b); } else if( fabs(b) < 0.1 ){ printf("%.1f\n",a); } else if( b<0 ){ printf("%.1f%.1fi\n",a,b); } else{ printf("%.1f+%.1fi\n",a,b); } } void print2(float a,float b,float c,float d) { //加 if( b<0 && d<0){ printf("(%.1f%.1fi) + (%.1f%.1fi) = ",a,b,c,d); } else if( b<0 ){ printf("(%.1f%.1fi) + (%.1f+%.1fi) = ",a,b,c,d); } else if( d<0 ){ printf("(%.1f+%.1fi) + (%.1f%.1fi) = ",a,b,c,d); } else { printf("(%.1f+%.1fi) + (%.1f+%.1fi) = ",a,b,c,d); } } void print3(float a,float b,float c,float d) { //减 if( b<0 && d<0){ printf("(%.1f%.1fi) - (%.1f%.1fi) = ",a,b,c,d); } else if( b<0 ){ printf("(%.1f%.1fi) - (%.1f+%.1fi) = ",a,b,c,d); } else if( d<0 ){ printf("(%.1f+%.1fi) - (%.1f%.1fi) = ",a,b,c,d); } else { printf("(%.1f+%.1fi) - (%.1f+%.1fi) = ",a,b,c,d); } } void print4(float a,float b,float c,float d) { //乘 if( b<0 && d<0){ printf("(%.1f%.1fi) * (%.1f%.1fi) = ",a,b,c,d); } else if( b<0 ){ printf("(%.1f%.1fi) * (%.1f+%.1fi) = ",a,b,c,d); } else if( d<0 ){ printf("(%.1f+%.1fi) * (%.1f%.1fi) = ",a,b,c,d); } else { printf("(%.1f+%.1fi) * (%.1f+%.1fi) = ",a,b,c,d); } } void print5(float a,float b,float c,float d) { //除 if( b<0 && d<0){ printf("(%.1f%.1fi) / (%.1f%.1fi) = ",a,b,c,d); } else if( b<0 ){ printf("(%.1f%.1fi) / (%.1f+%.1fi) = ",a,b,c,d); } else if( d<0 ){ printf("(%.1f+%.1fi) / (%.1f%.1fi) = ",a,b,c,d); } else { printf("(%.1f+%.1fi) / (%.1f+%.1fi) = ",a,b,c,d); } }
在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!