试题编号: 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++语言程序(方法四)如下: