今天刷了一道蓝桥杯的题,因为这道题,对蓝桥杯彻底无语了。
算法训练 P1103
编程实现两个复数的运算。设有两个复数 和 ,则他们的运算公式为:
要求:
(1)定义一个结构体类型来描述复数。
(2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。
(3)必须使用结构体指针的方法把函数的计算结果返回。
说明:用户输入:运算符号(+,-,*,/) a b c d.
输出:a+bi,输出时不管a,b是小于0或等于0都按该格式输出,输出时a,b都保留两位。
输入:
- 2.5 3.6 1.5 4.9
输出:
1.00+-1.30i
#include<stdio.h>
int main()
{
char ch;
double a,b,c,d;
scanf("%c%lf%lf%lf%lf",&ch,&a,&b,&c,&d);
if(ch=='+')
{
printf("%.2lf+%.2lfi",a+c,b+d);
}
if(ch=='-')
{
printf("%.2lf+%.2lfi",a-c,b-d);
}
if(ch=='*')
{
printf("%.2lf+%.2lfi",a*c-b*d,a*d+b*c);
}
if(ch=='/')
{
printf("%.2lf+%.2lfi",(a*c+b*d)/(c*c+d*d),(b*c-a*d)/(c*c+d*d));
}
return 0;
}
测试截图:
重点看提交序号为848606,提交的目标代码没有满足三条要求中的任何一条,居然得了满分,严重怀疑测试系统仅仅是判断最后一步输出是否满足要求而已,
其他的一概不管。宝宝不能说什么了,宝宝心里苦啊,刷了这么久的题,蓝桥官方居然是这种态度对待广大参赛者。
下面是我写的代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct Num
{
double real;
double imag;
};
double a1,b1,a2,b2;
void Input()
{
scanf("%lf%lf%lf%lf",&a1,&b1,&a2,&b2);
}
Num *add()
{
Num *ans;
ans=(Num *)malloc(sizeof(Num));
ans->real=a1+a2;
ans->imag=b1+b2;
return ans;
}
Num *sub()
{
Num *ans;
ans=(Num *)malloc(sizeof(Num));
ans->real=a1-a2;
ans->imag=b1-b2;
return ans;
}
Num *mul()
{
Num *ans;
ans=(Num *)malloc(sizeof(Num));
ans->real=a1*a2-b1*b2;
ans->imag=a1*b2+a2*b1;
return ans;
}
Num *div()
{
Num *ans;
ans=(Num *)malloc(sizeof(Num));
if(a2==0||b1==0||b2==0) return NULL;
double den=a2*a2+b2*b2;
ans->real=(a1*a2+b1*b2)/den;
ans->imag=(b1*a2-a1*b2)/den;
return ans;
}
int main()
{
char op;
Num *ans;
ans=(Num *)malloc(sizeof(Num));
scanf("%c",&op);
Input();
switch(op)
{
case '+':ans=add();break;
case '-':ans=sub();break;
case '*':ans=mul();break;
case '/':ans=div();break;
default :break;
}
printf("%.2lf+",ans->real);
printf("%.2lfi",ans->imag);
return 0;
}
本地编译器运行截图如下:
而在蓝桥杯的练习系统中的测试结果:
思考了很久,修改了很多细节的地方,程序仍然不能通过,竟无语哽咽。
若问蓝桥有多水,回答曰:这是第一次参加,也是最后一次。蓝桥你要珍重,且行且珍惜。
细节决定成败。