歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

北郵2011網研復試上機題——復數集合

前言

從我開始在中傳讀研開始到現在已經有將近一年半了,從最初的計算機小白到現在的好聯系服務器端主力開發成員,我能每天感受到自己的進步,但是心裡一直耿耿於懷的是當時北郵復試被刷的事情,我雖然慶幸能在中傳遇到我人生最重要的兩位導師(黃老師、范老師),這兩位老師從各個方面重新打造了我,讓我現在能夠一直在進步,但是我還是很不爽復試被刷以及上機考試竟然沒有ac一道題。這一年半的時間,我不敢偷懶,php雖然是我主要的編程語言,但是對c的不能忘懷讓我一直掛念那當時的北郵復試題啊!今天花了將近1個小時把當時的第二道題在九度AC了,記錄一下吧!  

思路

說實在的,這道復數題現在看沒有任何難度,基本上考了兩個點吧
  • 如何處理輸入輸出,將字符串轉換成需要的數字
  • 通過全局變量實現插入排序的思想(ps:插入排序可以參考http://www.linuxidc.com/Linux/2012-12/75350.htm  )

題目描述:

一個復數(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>
#define max_size 1000 struct stack
{
 int data[max_size];
 int top;
}; void initStack(struct stack *);
void pushStack(struct stack *, int );
int popStack(struct stack *);
int main()
{
 unsigned int m, num;
 unsigned long int a, b, plus, remainder;
 struct stack *pstack;
 pstack = (struct stack *)malloc(sizeof(struct stack));  while(scanf("%d", &m) != EOF && m != 0)
 {
  scanf("%ld %ld", &a, &b);
 
  //初始化
  plus = a + b;
  initStack(pstack);   //考慮a+b=0的情況
  if(plus == 0)
  {
   pushStack(pstack, 0);
  }   //求m進制數
  while(plus)
  {
   remainder = plus % m;
   pushStack(pstack, remainder);
   plus /= m;
  }
     
  //打印輸出
  while(pstack->top > 0)
  {
   num = popStack(pstack);
   printf("%d", num);
  }
  printf("\n");
 }  return 0;
} void initStack(struct stack *s)
{
 s->top = 0;
} void pushStack(struct stack *s, int data)
{
 if(s->top < max_size + 1)
 {
  s->data[s->top ++] = data;
 }
} int popStack(struct stack *s)
{
 if(s->top > 0)
 {
  return s->data[-- s->top];
 }
}
Copyright © Linux教程網 All Rights Reserved