北邮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程序导师应该不知道,虽然项目很忙,体谅一下我的好学心情吧感谢我的女朋友,让我全心投入我最爱的领域,加油、加油、加油!
相关文章推荐
- 北邮2011网研复试上机题——复数集合
- 【北邮复试机试】复数集合
- 2010北邮复试上机网研的题目:(1)
- 2010北邮复试网研上机题——打牌
- 2010北邮复试网研上机题——打牌
- 2011 北邮计算机复试 机试代码
- 北邮2018计算机院考研复试上机题解+结果统计
- 2012北邮计算机考研复试上机题解
- 北邮考研复试C语言上机题目精选
- 2016北邮计算机考研复试上机题解
- 2015北邮计算机考研复试上机题解
- 北邮2012年复试上机题目
- 2014北邮计算机考研复试上机题解(上午+下午)
- 北邮2012年复试上机题目
- 北邮OJ 102. 最远距离 北邮2012网研院复试上机题
- 北航研究生复试2011上机第三题:显示省略
- 2010北邮复试上机网研题目A
- 2010北邮复试网研上机题
- 2010北邮复试上机网研题目B
- 2010北邮复试网研上机题