码迷,mamicode.com
首页 > 其他好文 > 详细

【CCF】找相反数

时间:2015-08-13 14:27:06      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:ccf   相反数   链表   集合   

题目1相反数
时间限制:1秒空间限制:256MB
问题描述
有N个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a和?a为一对相反数)。
输入格式
第一行包含一个正整数N。(1≤N≤500)。
第二行为N个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
只输出一个整数,即这N个数中包含多少对相反数。
输入样例
5
123-1-2
输出样例

2


① 链表法

#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;

class Node{
	public:
		int data;
		Node* next;
		Node(){
			next = NULL;
		}
};

class LinkedList{
private:

	Node* head;
	Node* last;
	int len ;
public:
	LinkedList(){
		head = NULL;
		last = NULL;
		len = 0;
	}
	~LinkedList(){
		Node*p=head;
		Node*q;
		while(p){
			q = p;
			p=p->next;
			delete q;
		}
	}
	void add(int element){
		if(head){
			last->next=new Node();
			last->next->data=element;
			last = last->next;
			len ++;
		}
		else{
			head = new Node();
			head->data = element;
			last = head;
			len ++;
		}
	}
	void remove(int i){
		Node* p=head;
		Node* q=NULL;
		if(i==0){
			q=p;
			head=head->next;
			delete q;
			return;
		}
		while(i--){
			q=p;
			p=p->next;
		}
		if(p->next){
			Node* m = p;
			p=p->next;
			q->next = p;
			delete m;
		}
		else{
			last = q;
			last->next=NULL;
			delete p;
		}
	}
	void display(){
		Node* p = head;
		while(p){
			cout<<p->data<<" ";
			p=p->next;
		}
		cout<<endl;
	}
	Node* gethead(){
		return head;
	}
};

int main(){
	LinkedList pn;//正数
	LinkedList nn;//负数
	srand((unsigned int)time(0));
	int tn,n;
	cin>>tn;
	while(tn--){
		n=rand()%1000 * ((rand()%2==0)?1:-1);
		cout<<n<<" ";
	//	cin>>n;
		if(n>0){
			pn.add(n);
		}
		else{
			nn.add(-n);
		}
	}
	cout<<endl;
	Node* pn_head = pn.gethead();
	Node* nn_head;
	int i,amout=0;
	while(pn_head){
		nn_head = nn.gethead();
		i = 0;
		while(nn_head){
			if(nn_head->data==pn_head->data){
				cout<<nn_head->data<<" -"<<pn_head->data<<endl;
				amout++;
				nn.remove(i);
				break;
			}
			i++;
			nn_head=nn_head->next;
		}
		pn_head=pn_head->next;
	}
	cout<<amout<<endl;
	return 0;
}
② 集合法(参考地址:http://zhidao.baidu.com/link?url=goVljwhiSGnJhCyU39b7uuPe7yB95QxtRVIqTPCTpzZls-UMzfJShm0tW2sxHtrd895mj8p7mWOPPhtqzujPt7PvtEVwPyUfv_OueeZKF7K)

#include<iostream>
#include<set>
using namespace std;
int main(){
	int N,n;
	set<int> s;
	cin>>N;
	int i = N;
	while(i--){
		cin>>n;
		if(n>=0){
			s.insert(n);
		}
		else{
			s.insert(-n);
		}
	}
	cout<<(N-s.size())<<endl;
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

【CCF】找相反数

标签:ccf   相反数   链表   集合   

原文地址:http://blog.csdn.net/u013580497/article/details/47611337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!