试题编号: 201403-1
试题名称: 相反数
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
输出格式
只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5
1 2 3 -1 -2
样例输出
2
方法一 O(n^2)暴力
#include <iostream>
#include <cstring>
#include <cmath>
#define N 500
int a[N+1];
using namespace std;
int number;
int main()
{
int n,num,i;
memset(a,0,sizeof(a));
for(int i =0;i<N;i++){
a[i]=1001;
}
int temp=0;
cin>>n;
for(int i =0;i<n;i++){
cin>>num;
a[i]=num;
}
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if((a[j]+a[k])==0)
number++;
}
}
cout<<number/2;
//比较了两次 所以出结果需要➗2
return 0;
}
方法二
由于给的数据是不重复的
在每次输入数据时,将该数字的绝对值所对应的下标的元素进行标记,下一次输入时,检验该数字的绝对值对应的下标的元素是否有标记,如果有,那就是一对相反数.
#include <iostream>
#include <cstring>
#include <cmath>
#define N 2000
int a[N+2];
using namespace std;
int number;
int main()
{
int n,num,i;
memset(a,0,sizeof(a));
int temp=0;
cin>>n;
while(n--){
cin>>num;
if(a[abs(num)] == 1 )
number++;
a[abs(num)] = 1;
}
cout<<number;
return 0;
}
方法三
学习自大佬的博客(见文末)
使用map集合来进行检验.
每次输入数都检查该数的相反数是否存在.
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, int> m;
int n, v, number=0;
cin >> n;
for(int i=0; i<n; i++) {
cin >> v;
// 判断负值是否已经存在,构建Map,统计
//find(-v) 如果 == m.end() 即没有找到该元素的相反数,所以新建map
if(m.find(-v) == m.end())
m[v]++;
else
// 找到了 即存在该元素的相反数
number++;
}
cout << number<< endl;
return 0;
}
整型:
int abs(int i) //返回整型参数i的绝对值
复数:
double cabs(struct complex znum) //返回复数znum的绝对值
双精度浮点型:
double fabs(double x) //返回双精度参数x的绝对值
长整型:
long labs(long n) //返回长整型参数n的绝对值
学习自大佬的博客:CCF-CSP认证历年真题解
感谢大佬的无私分享
放个好看的小姐姐