CSP201403-1 相反数(100分)

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

问题描述:(略)
问题分析:
    看似统计问题,问题在于如何统计。大致有以下几种方法可以求解:
    方法一:使用STL的map进行统计是最为有效的办法。需要考虑节省空间的问题。
    方法二:根据题意,输入值得绝对值不大于1000,即输入整数x,满足-1000<=x<=1000。由于C/C++没有负数下标,就令y=x+1000,这样就把x映射为y,满足0<=y<=2000。这样,就可以通过一个标志数组来进行判断和标记,输入数后则进行标记。
    方法三:对于输入的整数x,满足-1000<=x<=1000,并且每个数各不相同(这一点是关键),问题变得稍微简单一些,用过标志数组就可以解决。这样,就可以通过一个标志数组来进行判断和标记,输入数后则进行标记。
    方法四:对于输入数据,先读入数组中,然后进行排序。对于有序的有正有负的数,找其相反数就容易了。然而,排序需要付出一定的时间代价,其时间复杂度是O(n*logn)。

程序说明:
    方法一:一个典型的应用STL容器类的实例。
    方法二:程序中,数组valflag[]的类型也可以是bool,代码略有不同。
    方法三:(略)
    方法四:排序实现程序逻辑要简洁易懂一些,不多解释。

参考链接:(略)

提交后得100分的C++语言程序(方法四)如下:

猜你喜欢

转载自www.cnblogs.com/tigerisland45/p/10057412.html