试题编号: 201403-1
试题名称: 相反数
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

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

问题链接:CCF201403-1 相反数
问题简述:(略)
问题分析
重写解题博客以及解题程序代码(参见参考链接),解题逻辑更加清晰,解题代码更加简洁,多种解法顺序更加合理。
解法一:标记数组
由于输入的数据各不相同,并且输入数据绝对值不超过1000,这样就可以用一个下标1-1000的数组flag[]作为标记数组,用绝对值做标记就可以了,这样可以缩短数组的长度,因为实际数据的范围是-1000-1000,可以考虑把数组下标做个平移,映射为0-2000。只有数据值的范围比较小时,才可以用数组来进行标记,否则数组过长存储溢出。
需要强调的一点是,程序员应该显式地第变量进行初始化,而不是依赖于缺省的初始化。这是一个编程原则问题。
解法二:排序
对输入数据进行排序,然后再进行匹配,也是一种解决办法。这种办法有点杀鸡用牛刀的感觉,但是可以借这个解法学习一下STL的算法函数sort()的应用。另外一点,匹配是一种最为基础的编程技巧,应该掌握。
这种解法也可以不用考虑数据值的范围。
解法三:暴力搜索
暴力法也称为枚举法,被公认是一种速度慢的做法,其时间复杂度为O(n2)。然而,如果找不到好方法,有时候枚举法就是最好的方法。说是暴力搜索,还是要尽量避免重复计算,能少算一点算一点。计算量减半全靠循环控制了,一种基本的编程技巧。
解法四:用映射map做标记
用STL的map来做标记,也是一种好的做法,只需要把相反数之一用来构建map就可以了。这种解法可以不用考虑数据值的范围,只是程序计算时间和空间上代价会略为大一些。可以借这个解法学习一下map的应用。
也可以用STL的set来解决这个问题,只需要把相反数之一放入集合中就可以了,与map类似。
用Python语言程序解题
用Python语言主要用于解决应用问题,可以不必太考虑程序效率,只要程序逻辑清晰即可。这里给出的是一种字符串暴力搜索的解法,不是一种好的方案。网友给出了一种整数暴力搜索的解题方案,要好许多。
用Python语言程序来解这个题,从道理上来说,上述四种解法都可以有。
用Java语言程序解题
用Java语言程序来解这个题,从道理上来说,上述四种解法都可以有。给出一种题解程序。
程序说明:(略)
参考链接
CCF201403-1 相反数(100分)
题记:(略)

100分的C语言程序(解法一:标记数组)如下:

/* CCF201403-1 相反数 */#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define N 1000
int flag[N+1];int main(void)
{memset(flag, 0, sizeof(flag)); /* 变量初始化:清零 */int n, a, cnt = 0;scanf("%d", &n);while (n--) {scanf("%d", &a);if(flag[abs(a)] == 1) cnt++; /* 判断负值是否已经存在 */flag[abs(a)] = 1; /* 设置标志 */}printf("%d\n", cnt); /* 输出结果 */return 0;
}

100分的C++语言程序(解法二:排序)如下:

/* CCF201403-1 相反数 */#include <iostream>
#include <algorithm>
#include <cstdio>using namespace std;const int N = 500;
int a[N];int main()
{int n, cnt = 0;scanf("%d", &n);for (int i=0; i<n; i++) scanf("%d", &a[i]); // 读入数据sort(a, a + n); // 排序// 寻找相反数:使用两个指针从两边往中间找int left = 0, right = n - 1;while (left < right && a[left] < 0 && a[right] > 0)if (-a[left] == a[right]) cnt++, left++, right--;else if (-a[left] > a[right]) left++;else if (-a[left] < a[right]) right--;printf("%d\n", cnt); // 输出结果return 0;
}

100分的C语言程序(解法三:暴力搜索)如下:

/* CCF201403-1 相反数 */#include <stdio.h>#define N 500
int a[N];int main()
{int n, cnt = 0, i, j;scanf("%d", &n);for (i = 0; i < n; i++) scanf("%d", &a[i]); /* 读入数据 *//* 暴力搜索 */for (i = 0; i < n; i++)for (j = i + 1; j < n; j++)if (a[i] + a[j] == 0) cnt++;printf("%d\n", cnt); /* 输出结果:不会重复计数 */return 0;
}

100分的C++语言程序(解法四:用映射map做标记)如下:

/* CCF201403-1 相反数 */#include <iostream>
#include <map>using namespace std;int main()
{map<int, int> m;int n, a, cnt = 0;cin >> n;for(int i=0; i<n; i++) {cin >> a; // 读入数据if (m.find(-a) == m.end()) m[a]++; // 判断负值是否已经存在,构建Mapelse cnt++; // 计数统计}cout << cnt << endl; // 输出结果return 0;
}

100分的Python语言程序(解法三:整数暴力搜索)如下:

# CCF201403-1 相反数n = int(input())
nums = [int(num) for num in input().split()]
c = 0
for num in nums:if -num in nums:c += 1
# 因为正负值都会计数,所以结果是计数值除以2
print(int(c / 2))

100分的Python语言程序(解法三:字符串暴力搜索)如下:

# CCF201403-1 相反数n = int(input())
nums = input().split()
c = 0
for i in range(n):if str(-int(nums[i])) in nums:c += 1
# 因为正负值都会计数,所以结果是计数值除以2
print(int(c / 2))

100分的JAVA语言程序(解法二:排序)如下:

/* CCF201403-1 相反数 */import java.util.Scanner;
import java.util.Arrays;public class Main {public static void main(String args[]){Scanner input = new Scanner(System.in);int n = input.nextInt();int a[] = new int[n];for (int i = 0; i < n; i++) a[i] = input.nextInt();Arrays.sort(a);int left = 0, right = n - 1, cnt = 0;while (left < right && a[left] < 0 && a[right] > 0)if (-a[left] == a[right]) {cnt++; left++; right--;              } else if (-a[left] > a[right]) left++;else if (-a[left] < a[right]) right--;System.out.println(cnt);}
}

CCF201403-1 相反数(100分)【序列处理】相关推荐

  1. CCF201403-1 相反数(100分)

    试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 ...

  2. CCF201403-1 相反数(解法三)(100分)(废除!!!)

    试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 ...

  3. CCF201403-1 相反数(解法二)(100分)(废除!!!)

    试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 ...

  4. #CSP 201403-1 相反数(100分)

    问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个正整数 N.(1 ≤ N ≤ 500). 第二行为 N 个用单 ...

  5. CCF201612-1 中间数(100分)【序列处理+排序】

    试题编号: 201612-1 试题名称: 中间数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一个整数序列a 1, a 2, -, a n中,如果存在某个数,大于它的整数 ...

  6. CCF201604-1 折点计数(100分)【序列处理】

    试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长,而后一天 ...

  7. CCF201509-1 数列分段(100分)【序列处理】

    试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? ...

  8. CSP202009-2 风险人群筛查(100分)【序列处理】

    试题编号: 202009-2 试题名称: 风险人群筛查 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 题目背景 某地疫情爆发后,出于"应检尽检"的原则,我们想要通知 ...

  9. CSP202012-1 期末预测之安全指数(100分)【序列处理】

    试题编号: 202012-1 试题名称: 期末预测之安全指数 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 样例1输入 6 2 60 10 100 0 70 0 0 -10 50 10 ...

最新文章

  1. Java多线程:线程8锁案例分析
  2. vue+vuex+leaflet Jest单测踩坑指南
  3. UWP crop image control
  4. addEventListener 的用法示例介绍
  5. deepin--安装Anaconda
  6. 【转载】(EM算法)The EM Algorithm
  7. Facebook再次发生全球性宕机
  8. JS设置弹出小窗口。
  9. Visual C# 资源文件编程--创建资源文件
  10. 小任务:简单实现银行业务系统(附 ideal编辑器固定序列化版本方法)
  11. UMD 被淘汰了吗?不考虑的 UMD 的库如何在纯 UMD 前端项目中运行?
  12. 最全面的安卓编码规范
  13. 数据库应用技术课程设计之商城管理系统
  14. Java TCP网络编程
  15. python中div是什么意思_python中divmod是什么
  16. 对于线性代数、特征空间、特征提取、深度学习的一些深夜思考
  17. HAL库开发—基于stm32的智能小家电
  18. MySQL密码忘记了?不慌~
  19. emmc/sd驱动总线简析
  20. windows server enterprise 2008 激活办法

热门文章

  1. ssm框架重定向_精选 SSM 框架面试题整理
  2. 使用GDAL库中的RPC校正问题
  3. JVM的7种垃圾收集器
  4. 学习java第一天 (大白(●—●))
  5. jadc连接oracle,用jdbc连接oracle的第一次经历
  6. 已超过了锁请求超时时段_分布式锁:效率与正确性的衡权
  7. 计算机教育杂志社投稿送样刊,电脑校园杂志征稿论文发表--期刊发表网网
  8. html菜单不动属性,html5规定元素的上下文菜单属性contextmenu
  9. 计算机网络-自顶向下方法(7th) 第四章 Review Questions 英文题目
  10. scala中zip拉链的操作