北邮oj 108 虚数

时间限制 1000 ms  内存限制 65536 KB

题目描述

给你一个复数集合{Aj+i*Bj},保证Aj和Bj都是整数,初始为空集。

每次会给你如下两种操作中的一种:

       1."Insert x+iy",其中x,y都是整数。表示在集合中加入一个复数 x+iy,同时输出此时集合的大小;

       2."Pop"。如果集合为空集直接返回“Empty!”,如果有元素则以"x+iy"的形式显示集合中模值最大的复数,然后将该元素从集合中删除,之后在第二行显示操作之后的集合大小,如果为空集则显示“Empty!”。

输入格式

第一行只有一个数T,代表case数。0<=T<=10

每一组case:

       第一行有一个整数n,表示这组case中一共有n条命令 0<n<=100

       接下来n行每行有一个命令,命令如上所述

保证不会输入两个模值同样的元素,并保证实部虚部都大于0,小于1000。

输出格式

依照上述原则输出每一个命令对应的输出

如果输入命令是Insert命令,则对应的输出占一行为集合大小;

如果输入命令是Pop命令,则对应的输出占一行或者两行,为模值最大的复数和集合大小。

请注意,输出集合大小的格式为"Size:空格x回车",x为集合大小

输入样例

1
5
Pop
Insert 1+i2
Insert 2+i3
Pop
Pop

输出样例

Empty!
Size: 1
Size: 2
2+i3
Size: 1
1+i2
Empty!
解题思路
这道题刚开始困惑我的是怎么存储这组数据,刚开始我是用的string数组,发现这样太麻烦了于是转化成了结构体类型。在解这个题中,我犯了一个数学错误,就是虚数的模,虚数的模式根号下a方加b方。
C++代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>


typedef struct Num
{
     int a;//实部
	 int b;//虚部
}Num;


int main()
{
   
	int T;
	scanf("%d",&T);
	while(T--)
			int n=0;
		Num num[100];
		scanf("%d",&n);
		int k=0;
		
		for(int m=0;m<n;m++)
		{
			char temp[30];
		    scanf("%s",temp);
			if(!strcmp(temp,"Insert"))
			{
				scanf("%d+i%d",&num[k].a,&num[k].b);
				k++;
				printf("Size: %d\n",k);
			}
			else if(!strcmp(temp,"Pop"))
			{
			   int max=0;
			   if(k==0)
				   printf("Empty!\n");
			   /*else if(k==1)
			   {
				   printf("%d+i%d\n",num[0].a,num[0].b);
				   printf("Empty!\n");
				   k--;
			   }*/
			   else
			   {
			       for(int i=1;i<k;i++)
				   {
					   if(num[max].a*num[max].a+num[max].b*num[max].b<num[i].a*num[i].a+num[i].b*num[i].b)
						   max=i;
				   }   
				   printf("%d+i%d\n",num[max].a,num[max].b);
				   for(int i=max;i<k-1;i++)
				   {
					   num[i].a=num[i+1].a;
					   num[i].b=num[i+1].b;
				   }
				
				   k--;
				   if(k>0)
				     printf("Size: %d\n",k);
				   else
					   printf("Empty!\n");
			   }
			}
		}
		
	}
	 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值