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

前言

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

思路

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

题目描述:

    一个复数(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程序导师应该不知道,虽然项目很忙,体谅一下我的好学心情吧
感谢我的女朋友,让我全心投入我最爱的领域,加油、加油、加油!
posted @ 2012-12-03 21:53  java程序员填空  阅读(204)  评论(0编辑  收藏  举报