码迷,mamicode.com
首页 > 其他好文 > 详细

CCF - 201403-1 - 相反数

时间:2017-09-14 23:49:24      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:scanf   center   set   ace   div   正整数   格式   idt   print   

问题描述

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

 

思路

看似统计问题,问题在于如何统计。
1.使用STL的map进行统计是最为有效的办法;
2.输入值x满足-1000<=x<=1000,由于C/C++没有负数下标,就令y=x+1000,而把x映射为y,满足0<=y<=2000。再通过一个标志数组来进行判断和标记,输入数后则进行标记;
3.输入整数各不相同,问题变得稍微简单一些,可以只用标志数组解决。

代码

#include<iostream>
#include<map>
using namespace std;
int main()
{
    int i,n,b,sum;
    map<int,int>a;
    scanf("%d",&n);
    for(sum=0,i=1;i<=n;i++)
    {
        scanf("%d",&b);
        if(a.find(-b)==a.end())
            a[b]++;
        else
            sum++;
    }
    printf("%d\n",sum);
    return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
    int i,n,sum,a[2001],b;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(sum=0,i=0;i<n;i++)
    {
        scanf("%d",&b);
        if(a[1000-b]!=0)
            sum++;
        a[b+1000]++;
    }
    printf("%d\n",sum);
    return 0;
}
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int i,n,sum,a[1001],b;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(sum=0,i=0;i<n;i++)
    {
        scanf("%d",&b);
        if(a[abs(b)]!=0)
            sum++;
        a[abs(b)]++;
    }
    printf("%d\n",sum);
    return 0;
}

 

CCF - 201403-1 - 相反数

标签:scanf   center   set   ace   div   正整数   格式   idt   print   

原文地址:http://www.cnblogs.com/5211314jackrose/p/7523062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!