CCF.201403-1相反数

试题编号: 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认证历年真题解

感谢大佬的无私分享

放个好看的小姐姐

发布了96 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41852212/article/details/103795217