您的位置:首页 > 其它

北邮2011网研复试上机题——复数集合

2012-12-03 21:53 302 查看

前言

从我开始在中传读研开始到现在已经有将近一年半了,从最初的计算机小白到现在的好联系服务器端主力开发成员,我能每天感受到自己的进步,但是心里一直耿耿于怀的是当时北邮复试被刷的事情,我虽然庆幸能在中传遇到我人生最重要的两位导师(黄老师、范老师),这两位老师从各个方面重新打造了我,让我现在能够一直在进步,但是我还是很不爽复试被刷以及上机考试竟然没有ac一道题。这一年半的时间,我不敢偷懒,php虽然是我主要的编程语言,但是对c的不能忘怀让我一直挂念那当时的北邮复试题啊!今天花了将近1个小时把当时的第二道题在九度AC了,记录一下吧!

思路

说实在的,这道复数题现在看没有任何难度,基本上考了两个点吧

如何处理输入输出,将字符串转换成需要的数字
通过全局变量实现插入排序的思想(ps:插入排序可以参考我的这篇博客

题目描述:

一个复数(x+iy)集合,两种操作作用在该集合上:

1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE;

2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE;

最开始要读入一个int n,表示接下来的n行每一行都是一条命令。

输入:

输入有多组数据。

每组输入一个n(1<=n<=1000),然后再输入n条指令。

输出:

根据指令输出结果。

样例输入:

3
Pop
Insert 1+i2
Pop


样例输出:

empty
SIZE = 1
1+i2
SIZE = 0


提示:

模相等的输出b较小的复数。

a和b都是非负数。

AC代码

彻彻底底的水题,当年竟然觉的如此艰难,唉,一年半之前我的基本功到底是有多差啊,淡淡的忧伤,话不多说,上AC代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct complex_num
{
int real;
int virtual;
int cvalue;
};
int top;

void popProcess(struct complex_num *);
void insertProcess(struct complex_num *, char *);

int main()
{
int i, n;
char str[100], num[100];
struct complex_num complexnum[1001];

while(scanf("%d", &n) != EOF)
{
top = 0;
for(i = 0; i < n; i ++)
{
scanf("%s",str);
switch(str[0])
{
case 'P' :
popProcess(complexnum);
break;
case 'I' :
scanf("%s",num);
insertProcess(complexnum, num);
break;
}
}
}
return 0;
}

void popProcess(struct complex_num *s)
{
if(top == 0)
{
printf("empty\n");
}else
{
printf("%d+i%d\n", s[top - 1].real, s[top - 1].virtual);
top --;
printf("SIZE = %d\n",top);
}
}

void insertProcess(struct complex_num *s, char *num)
{
int i, len, b;
struct complex_num temp;
len = strlen(num);

//获取复数数据
for(i = 0; i < len; i ++)
{
if(num[i] >= '0' && num[i] <= '9')
{
s[top].real = num[i] - '0';
while((i + 1) < len && num[i + 1] >= '0' && num[i + 1] <= '9')
{
s[top].real = 10 * s[top].real + (num[i + 1] - '0');
i ++;
}
}else if(num[i] == 'i')
{
s[top].virtual = num[i + 1] - '0';
while((i + 2) < len && num[i + 2] >= '0' && num[i + 2] <= '9')
{
s[top].virtual = 10 * s[top].virtual + (num[i + 2] - '0');
i ++;
}
break;
}
}
s[top].cvalue = s[top].real * s[top].real + s[top].virtual * s[top].virtual;
//数据排序
if(top > 0)
{
temp = s[top];
for(i = top - 1; i >= 0; i --)
{
if(s[i].cvalue > temp.cvalue)
{
s[i + 1] = s[i];
}else if(s[i].cvalue == temp.cvalue && s[i].virtual < temp.virtual)
{
s[i + 1] = s[i];
}else
{
break;
}
}
s[i + 1] = temp;
}
top ++;
printf("SIZE = %d\n",top);
}


后记

感谢我的两位导师,发自内心的感激,有你们的教导才能让我每天都能感受到自己的进步,哈哈,偷个懒写个acm程序导师应该不知道,虽然项目很忙,体谅一下我的好学心情吧
感谢我的女朋友,让我全心投入我最爱的领域,加油、加油、加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: