相反数
问题描述
有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5
1 2 3 -1 -2
样例输出
2
问题分析:
方法一:
#include <iostream>
#define M 501
//相反数
using namespace std;
int main(int argc, char *argv[]) {
int a[M],N,count=0;
cin>>N;
for(int i=0;i<N;i++){
cin>>a[i];
}
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
if(a[i]+a[j]==0){//互为相反数,相加为零
count++;
}
}
}
cout<<count<<endl;
return 0;
}
方法二:
#include <iostream>
#include <map>
#define M 501
//相反数
using namespace std;
int main(int argc, char *argv[]) {
map<int,int>m;//第一个类型的键类型,第二个是值类型
int N,num,count=0;
cin>>N;
for(int i=0;i<N;i++){
cin>>num;
//如果容器中存在按-num索引的元素,则返回指向该元素的迭代器。
//如果不存在,则返回超出末端迭代器m.end()。
if(m.find(-num)==m.end()){
//数字num的数量+1
m[num]++;
}
else count++;
}
cout<<count<<endl;
return 0;
}
方法三:
#include <iostream>
#include <cstring>
#define M 501
#define N 1000
//相反数
using namespace std;
int main(int argc, char *argv[]) {
int n,num,minus,count=0;
int a[N*2+1];
//变量初始化:清零
memset(a,0,sizeof(a));
cin>>n;
for(int i=0;i<n;i++){
cin>>num;
//值映射:从-1000<=v<=1000映射为0<=v'<=2000
minus=N-num;
num+=N;
//判断负值是否已经存在
if(a[minus]==1){
count++;
}
//num存在,进行标记
a[num]=1;
}
cout<<count<<endl;
return 0;
}