题目编号 |
3 |
时间限制 |
1000 毫秒 |
内存限制 |
32768 K字节 |
问题描述
计算两个复数的加减乘除。
输入
一个运算符和两个复数。运算符可能是+, -, * 或 /。然后是第一个复数的实部,第一个复数的虚部,第二个复数的实部,第二个复数的虚部。每个部分都可能是一个浮点数。 他们之间都用一个空格隔开。
输出
两个复数的运算结果。首先输出结果的实部,然后是结果的虚部。每个部分保留两位小数。
输入样例
* 1.0 2.5 3.5 4.0
输出样例
-6.50 12.75
用C++做的代码
#include
<
stdio.h
>
using
namespace
std;
struct
complex
{
float
real;
float
imag;
}
;
struct
complex add(
struct
complex num1,
struct
complex num2)
{
struct
complex num3;
num3.real
=
num1.real
+
num2.real;
num3.imag
=
num1.imag
+
num2.imag;
return
num3;
}
struct
complex substract(
struct
complex num1,
struct
complex num2)
{
struct
complex num3;
num3.real
=
num1.real
-
num2.real;
num3.imag
=
num1.imag
-
num2.imag;
return
num3;
}
struct
complex multiply(
struct
complex num1,
struct
complex num2)
{
struct
complex num3;
num3.real
=
num1.real
*
num2.real
-
num1.imag
*
num2.imag;
num3.imag
=
num1.real
*
num2.imag
+
num1.imag
*
num2.real;
return
num3;
}
struct
complex divide (
struct
complex num1,
struct
complex num2)
{
struct
complex num3;
num3.real
=
(num1.real
*
num2.real
+
num1.imag
*
num2.imag)
/
(num2.real
*
num2.real
+
num2.imag
*
num2.imag);
num3.imag
=
(num1.imag
*
num2.real
-
num1.real
*
num2.imag)
/
(num2.real
*
num2.real
+
num2.imag
*
num2.imag);
return
num3;
}
int
main(
int
argc,
char
*
argv[])
{
struct
complex num1,num2,num3;
char
oper;
scanf(
"
%f%f%f%f
"
,
&
num1.real,
&
num1.imag,
&
num2.real,
&
num2.imag);
switch
(oper)
{
case
'
+
'
:
num3
=
add(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
case
'
-
'
:
num3
=
substract(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
case
'
*
'
:
num3
=
multiply(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
case
'
/
'
:
num3
=
divide(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
default
:
printf(
"
Error!\n
"
);
}
system(
"
PAUSE
"
);
return
EXIT_SUCCESS;
}
用C做的代码
#include
<
stdio.h
>
struct
complex{
float
real;
float
imag;
};
struct
complex add(
struct
complex num1,
struct
complex num2){
struct
complex num3;
num3.real
=
num1.real
+
num2.real;
num3.imag
=
num1.imag
+
num2.imag;
return
num3;
}
struct
complex substract(
struct
complex num1,
struct
complex num2){
struct
complex num3;
num3.real
=
num1.real
-
num2.real;
num3.imag
=
num1.imag
-
num2.imag;
return
num3;
}
struct
complex multiply(
struct
complex num1,
struct
complex num2){
struct
complex num3;
num3.real
=
num1.real
*
num2.real
-
num1.imag
*
num2.imag;
num3.imag
=
num1.real
*
num2.imag
+
num1.imag
*
num2.real;
return
num3;
}
struct
complex divide (
struct
complex num1,
struct
complex num2){
struct
complex num3;
num3.real
=
(num1.real
*
num2.real
+
num1.imag
*
num2.imag)
/
(num2.real
*
num2.real
+
num2.imag
*
num2.imag);
num3.imag
=
(num1.imag
*
num2.real
-
num1.real
*
num2.imag)
/
(num2.real
*
num2.real
+
num2.imag
*
num2.imag);
return
num3;
}
int
main(
int
argc,
char
*
argv[]){
struct
complex num1,num2,num3;
char
oper;
scanf(
"
%c%f%f%f%f
"
,
&
oper,
&
num1.real,
&
num1.imag,
&
num2.real,
&
num2.imag);
switch
(oper){
case
'
+
'
:
num3
=
add(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
case
'
-
'
:
num3
=
substract(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
case
'
*
'
:
num3
=
multiply(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
case
'
/
'
:
num3
=
divide(num1,num2);
printf(
"
%.2f %.2f\n
"
,num3.real, num3.imag);
break
;
default
:
printf(
"
Error!\n
"
);
}
system(
"
PAUSE
"
);
return
0
;
}
这两段代码做的是复数加减乘除的运算。基本上运行起来都是对的,但是老师给了我们个调试的网站,AC是完全正确,而我用C++做的,不管怎么试还是次之的WA。后来测试发现应该是精度的关系。但是C++里面控制精度的不是setprecision()这个函数吗?为什么我用了他之后却仍是无法控制呢。只要是整数的,他就不会留小数点后的数字0。难道还有其他的函数控制,还是用法的错误呢?郁闷!